Главная страница
    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.036 c
1-1142101579
AdmeraL
2006-03-11 21:26
2006.04.16
Сообщение Wm_MouseMove и его параметры


2-1143292789
Дмитрий_177
2006-03-25 16:19
2006.04.16
Выравнивание по фотме панелей


15-1142436289
infom
2006-03-15 18:24
2006.04.16
Клиент-сервер чат для локальной сети.


2-1143875943
tort
2006-04-01 11:19
2006.04.16
Почему окно вылезает два и более раз?


1-1142236876
kyn66
2006-03-13 11:01
2006.04.16
Как напрвить действие на группу элементов?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский