Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
ВнизПодскажите быстрый способ читать из файла и писать в него. Найти похожие ветки
← →
Sagrer (2004-01-12 17:55) [0]В общем, мне надо считывать содержимое файла в переменную типа string (которая по умолчанию стоит - AnsiString).
Сейчас делаю через BlockRead, вот так примерно.
(код просто выдернул из своего модуля, там наверняка есть полно ненужного и закомментированного)
Function TFileInString.Load(const FName : string) : boolean;
var
I : int64;
F1 : file;
//f2 : file of byte;
buf : array[1..2048] of char;
NumRead : integer;
OldFilMod : byte;
begin
OldFilMod := FileMode;
FileMode := 0; //Выставить ридонли
Result := false;
//Процедура загрузки в строку.
//Открываю файл и получаю его размер.
//Кстати проверяю файл на его наличие :).
If FileExists(FName) = true then begin
//Если файл как ни странно на месте....
//Получаю размер
AssignFile(F1,FName);
Reset(F1,1);
//Подготавливаю строку
SetLength(FileString,Siz);
FileString := "";
//Собсно гружу...
repeat
BlockRead(F1,buf,sizeof(buf),numread);
//Если блок полный
if NumRead = SizeOf(Buf) then begin
FileString := FileString+buf
end
//если не полный
else if numread <> 0 then begin
I := 0;
repeat
I := I+1;
FileString := FileString+buf[I];
until I = numread;
//siz := siz+numread;
end;
until NumRead <> SizeOf(Buf);
//Закрываю файло и ставлю перекл, что файл хоть раз но читался.
CloseFile(F1);
FirstLoaded := true;
Result := true;
end
else begin
//Наорать на юзверя (или программера), что файла нету!
MsgOK("Ошибка! Типа не могу открыть файл, т.к. открывать то нечего. Проверьте пути.");
end;
FileMode := OldFilMod; //Вернуть дефолт...
end;
Пишу аналогично, через BlockWrite.
Раньше вообще работал через AssignFile + Reset\Append\Rewrite
+Read(LN) \Write(LN), и вообще медленно было.
Через BlockRead побыстрее, с файлами около мегабайта нормально работало, но вот сравнивать побайтово 2 папки по 300 мб (загрузить 2 файла в строки, сравнить строки) - уже больше 10 минут занимает.
← →
Romkin (2004-01-12 18:21) [1]А что ты хотел? Судя по времени - нормальная скорость. Чтобы примерно понять, каков предел, сделай копию 300метровой этой папки и время подели на 2. Тогда и смотри, насколько еще ускорить возможно
← →
Sandman25 (2004-01-12 18:29) [2]Зачем копировать файлы полностью в строки, если их нужно только сравнивать? Загрузил 2 куска файла, сравнил, загрузил следующие куски.
← →
Devel (2004-01-12 18:32) [3]попробуйеще для сравнения вот так:
var
DataFile: THandle;
FileSize: DWORD;
S: string;
begin
DataFile := FileOpen("c:\твой файл.txt", fmOpenRead or fmShareDenyNone);
if DataFile = 0 then
RaiseLastOSError();
try
FileSize := GetFileSize(DataFile, nil);
SetLength(S, FileSize);
FileRead(DataFile, Pointer(S)^, FileSize);
//...твой код
finally
CloseHandle(DataFile);
end;
end;
← →
Polevi (2004-01-12 20:09) [4]отобрази файл в память - CreateFileMapping, MapViewOfFile
тогда твоя строка := PChar(результат вызова MapViewOfFile)
← →
jack128 (2004-01-13 09:27) [5]
> Polevi © (12.01.04 20:09) [4]
а с чего Вы взяли, что последним символом в файле будет #0 ? ;-)
← →
mrcat (2004-01-13 09:31) [6]>Sagrer (12.01.04 17:55)
CreateFileMapping, MapViewOfFile, CompareMem
← →
Polevi (2004-01-13 10:43) [7]>jack128 © (13.01.04 09:27) [5]
молодец, возьми с полки пирожок :-)
← →
jack128 (2004-01-13 11:08) [8]Ням-ням. А еще? :-)
← →
MV (2004-01-13 13:23) [9]Еще быстрее - как Oracle, создай свой особый раздел на диске, в нем - свою структуру и юзай.
← →
Seldon (2004-01-13 21:46) [10]function LoadFromFile(FileName:String):String;
var
FS:TFileStream;
begin
FS:=TFileStream.Create(FileName,fmOpenRead);
SetString(Result,nil,FS.Size);
FS.Read(Pointer(Result)^,FS.Size);
FS.Free;
end;
procedure SaveToFile(FileName,Str:String);
var
FS:TFileStream;
begin
FS:=TFileStream.Create(FileName,fmCreate);
FS.Seek(0,soFromBeginning);
FS.Write(Pointer(Str)^,Length(Str));
FS.Free;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c