-
При запуске и завершении приложения мне нужно, как можно быстрее, загружать/сохранять в файл некие текстовые данные. Какой способ посоветуете использовать?
P.S. Или всё-таки использовать паскалевкий: AssignFile, Reset... или через Streams?
-
Про файловые потоки. Есть такое(не KOL'овское):
//записи/перезаписи файла Procedure WriteFile(s, FileName:string); begin with TFileStream.create(FileName, fmCreate or fmOpenWrite) do try write(pointer(s)^,length(s)); finally free; end; end; //Чтение файла var p : PChar; begin GetMem(p, 255);
with TFileStream.Create('c:\1.txt', fmOpenReadWrite) do try Seek(10,soFromBeginning); read(p^, 254); finally free; end; FreeMem(p); end;
Как переписать их под KOL?
-
PStrList.LoadFromFile/SaveToFile
-
Или использовать PStream(примеры на сайте есть)
-
Зачем использовать обертки! Используй WinAPI. Чтение и запись файлов в нем элементарны.
-
открывать напрямую файловый поток это не быстро. а если работа идет с сетевого диска, так вообще убицца.
самый быстрый способ это создать NewMemoryStream. все записи сделать в него, а потом после всего сделать stream.savetofile и сбросить поток на диск одним махом.
-
> Barloggg
А если файл > 5 мб?
-
//записи/перезаписи файла Procedure WriteFile(s, FileName:string);
var F: PStream;
begin
F:=NewWriteFileStream(FileName);
F.Position:=F.Size;
try
F.WriteStrZ(s);
finally
F.Free;
end;
end; //Чтение файла var
s: string;
F: PStream;
begin
F:=NewReadFileStream('c:\1.txt');
try
F.Position:=10;
F.ReadStrZ(S);
finally
F.Free;
end;
end; Это для случая, когда строки оканчиваются нулевым байтом. Если нужно завершать стандартно (#13#10), то так: //записи/перезаписи файла Procedure WriteFile(s, FileName:string);
var F: PStream;
C: Char;
begin
F:=NewWriteFileStream(FileName);
F.Position:=F.Size;
try
F.WriteStr(s);
C:=#13;
F.Write(C,1);
C:=#10;
F.Write(C,1);
finally
F.Free;
end;
end; //Чтение файла var
s: string;
F: PStream;
begin
F:=NewReadFileStream('c:\1.txt');
try
F.Position:=10;
F.ReadStr(S);
finally
F.Free;
end;
end;
-
есть функции StrLoadFromFile\StrSaveToFile
-
> Elec3C © (12.12.07 13:32) [6] > > > > Barloggg > > А если файл > 5 мб? >
да хоть сколько. оперативки у нас теперь много. Я таким образом в одной программе сбрасывал на диск 50 мегабайтные битмапы компонуя их в памяти побайтно. запись на диск длилась много меньше чем создание и занимало полторы-три секунды. Так что можно.
-
> Dimaxx > D[u]fa > Barloggg
Всем спасибо.
-
Последняя просьба: Barloggg можешь привести примерчик по NewMemoryStream?
-
Filestream'овсеий ReadStr ну просто жутко медленный. ну и запись по одному байту в стиле WriteStr(s); WriteStr(#13) будет существенно медленнее, чем WriteStr(S+#13)
с BufferedStream от Thaddy ускорение на порядок (или два, не помню уже) если надо быстро, надо буферизовать обязательно. или хотя бы через memorystream
-
> GMax
А можно примерчик буфферизированой/го записи/чтения?
-
> Последняя просьба: Barloggg можешь привести примерчик по > NewMemoryStream?
var strm:Pstream;
strm:=NewMemorystream;
...
запись в strm
...
strm.savetofile('filename',0,strm.position);
strm.free;
-
> Barloggg
Спасибо.
-
Elec3C, я не примерчик, я ссылку на www.thaddy.com дам :) там есть KOLBufferedStream. правда в нем есть немного ошибок, Тэдди их так и не поправил, хотя я ему патч высылал, но для 5 мег файла сойдёт :)
-
-
> Elec3C, я не примерчик,
Я просил привести пример использования буфферизированой/го записи/чтения файла, а не называл тебя "примерчиком"!!!
-
Elec3C не читатель, Elec3C писатель. умолкаю %)
|