Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

Как записать данные в начало файла   Найти похожие ветки 

 
Setor   (2006-03-27 19:04) [0]

Требуется записать данные в начало файла (headers). Размер файла более 100Мб. Пока что приходится создавать новый файл, записывать в него Header, а сверху добавлять содержимое огромного файла. Это медленно и нерационально. Попытался сделать Seek Отрицательным, но в документации сказано, что "Seek moves to the position Offset. Offset must be >= 0". Не работает, начало файла заменяется новыми данными, а мне нужно лишь его дополнить.

Логически это верно - файл создаётся на диске и может быть дополнен с конца или полностью перезаписан. Может есть какой-то оптимальный алгоритм, или всётаки придётся копировать сотни мегабайт из 1 файла в другой?

var
 MyStream: TFileStream;
begin
 MyStream:= TFileStream.Create( "test.txt", fmOpenReadWrite );
 try
   MyStream.Seek( -4, soFromBeginning );
   MyStream.Write( "test", 4 );
 finally
   MyStream.Free;
 end;


 
Джо ©   (2006-03-27 19:06) [1]

> или всётаки придётся копировать сотни мегабайт из 1 файла
> в другой?

Придется :)


 
Гаврила ©   (2006-03-28 21:55) [2]

а если в рамках одного файла?
все сдвинуть назад на размер хедера, и вписать что надо


 
Германн ©   (2006-03-29 02:06) [3]


> Гаврила ©   (28.03.06 21:55) [2]
>
> а если в рамках одного файла?
> все сдвинуть назад на размер хедера, и вписать что надо


А это, пардон, как?


 
Alarm ©   (2006-03-29 08:53) [4]

Запиши свой заголовок в файл и "склей" его со 100мгб файлом

copy /b file1 + file2 newfile


 
MBo ©   (2006-03-29 13:29) [5]


function AddStartData(const FileName: string; var Data; Size: Integer): Boolean;
var
 hf, hm: THandle;
 i, OldSize: Integer;
 pb: PByteArray;
begin
 Result := False;
 hf := FileOpen(FileName, fmOpenReadWrite);
 if hf <> INVALID_HANDLE_VALUE then begin
   OldSize := GetFileSize(hf, nil);
   SetFilePointer(hf, OldSize + Size, nil, FILE_BEGIN);
   SetEndOfFile(hf);
   hm := CreateFileMapping(hf, nil, PAGE_READWRITE, 0, 0, nil);
   if hm > 0 then begin
     pb := MapViewOfFile(hm, FILE_MAP_ALL_ACCESS, 0, 0, 0);
     if pb <> nil then begin
       for i := OldSize - 1 downto 0 do
         pb[i + Size] := pb[i];
       Move(Data, pb[0], Size);
       FlushViewOfFile(pb, 0);
       UnMapViewOfFile(pb);
       Result := True;
     end;
     CloseHandle(hm);
   end;
   CloseHandle(hf);
 end;
end;


Пример использования:

s := StringOfChar("A", 100) + #13#10;
AddStartData("e:\data.dat", s[1], Length(s));


 
Leonid Troyanovsky ©   (2006-03-29 14:09) [6]


> MBo ©   (29.03.06 13:29) [5]


IMHO, не стоит делать просмотр на 100Мб, лучше уж по-старинке,
переносить буфером размером с кластер.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
2-1143713097
Yegorchic
2006-03-30 14:04
2006.04.16
CheckBox.Caption в 2 строки


15-1143011380
Бугага
2006-03-22 10:09
2006.04.16
Все голы сборной России по хоккею на Олимпиаде


8-1131908988
Toxa_ua
2005-11-13 22:09
2006.04.16
Как в Memo и ListBox вставить фоновый рисунок?


2-1143297744
KING
2006-03-25 17:42
2006.04.16
Нормализация БД


2-1143699058
Logos
2006-03-30 10:10
2006.04.16
Формула