Форум: "Начинающим";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизКак записать данные в начало файла Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c