Текущий архив: 2005.01.02;
Скачать: CL | DM;
Вниз
Проецируемые в память файлы Найти похожие ветки
← →
The Scorpion (2004-11-18 20:54) [0]При замене строчки в файле изменения происходят нормально ,но
при добавление строки ее видит только моя программа.Подскажите пожалуйста в чем я ошибся.
var
Form1: TForm1;
DwOldFree,DwNewFree,DWOLdComm,
DwNewComm,DwOldRese,DwNewRese:dword;
ind:byte;
data:pchar;
hFile,hMapping:thandle;
mbi : TMemoryBasicInformation;
procedure TForm1.Button3Click(Sender: TObject);
begin
data:=nil;
if opendialog1.Execute then
begin
hFile:=CreateFile ( Pchar (opendialog1.FileName),Generic_Read or GENERIC_WRITE,
0,nil,OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH,0 );
hMapping := CreateFileMapping (hFile, nil, PAGE_READWRITE ,
{SEC_RESERVE or SEC_COMMIT}0 ,0,nil );
CloseHandle (Hfile);
Data := MapViewOfFile (hMapping,FILE_MAP_ALL_ACCESS ,0,0,0);
memo1.SetTextBuf(data);
end;
end;
procedure TForm1.N3Click(Sender: TObject);
var
h:thandle;
begin
if (data=nil) then
if savedialog1.Execute then
begin
hFile:=CreateFile ( Pchar (savedialog1.FileName),Generic_Read or GENERIC_WRITE,
File_Share_Read,nil,OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN,0 );
hMapping := CreateFileMapping (hFile, nil, PAGE_READWRITE ,
{SEC_RESERVE or SEC_COMMIT}0 ,0,nil );
Data := MapViewOfFile (hMapping,FILE_MAP_ALL_ACCESS ,0,0,0);
memo1.GetTextBuf(data,memo1.GetTextLen+1) ;
FlushViewOfFile(data,memo1.GetTextLen+1);
data:=nil;
end;
memo1.GetTextBuf(data,memo1.GetTextLen+1) ;
FlushViewOfFile(data,memo1.GetTextLen+1);
UnmapViewOfFile (Data);
data:=nil;
end;
← →
Мастер © (2004-11-18 21:44) [1]А как второй процесс открывает проекцию?
← →
Ihor Osov'yak © (2004-11-18 21:55) [2]хм.. странно, что программа вообще не вылетает.
Вот здесь - в первом memo1.GetTextBuf(data,memo1.GetTextLen+1) ; - для случая, если размер файла менше, чем размер memo1.GetTextLen+1... Причина, возможно, в том, что память под мапирование распределяется страницами..
Увеличте текст в мемо более чем на 4096 символов - думаю, вылет будет гарантировано..
А не сохраняется потому, что Вы пытаетесь оперировать с памятью за пределами мапированой области.. Кто сказал, что в этом случае система размер файла будет увеличивать? Это что-то сродни попытки залить 4 литра в трехлитровую бутыль..
← →
The Scorpion (2004-11-18 23:26) [3]"Кто сказал, что в этом случае система размер файла будет увеличивать?"
А можно сделать так чтобы он увеличился?
← →
Игорь Шевченко © (2004-11-18 23:29) [4]
> можно сделать так чтобы он увеличился?
Нет. Под FileMapping место нужно отводить заранее.
Страницы: 1 вся ветка
Текущий архив: 2005.01.02;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.021 c