Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.05 c
2-1144224140
vegarulez
2006-04-05 12:02
2006.04.16
Как сделать, чтобы в bitmap button`a добавлялся i-ый файл?


8-1132134498
sco
2005-11-16 12:48
2006.04.16
Текстура и Освещение OpenGl


3-1140528041
TTT_111
2006-02-21 16:20
2006.04.16
Неизвестное программное исключение


15-1143572066
QuickFinder
2006-03-28 22:54
2006.04.16
Delphi5 for Windows x64


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский