Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.23;
Скачать: CL | DM;

Вниз

Подскажите быстрый способ читать из файла и писать в него.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-72737
zzzzz
2004-01-06 16:08
2004.01.23
Как сделать чтобы ShellExecute открывал страницу в новом окне?


3-72670
Vic
2003-12-25 17:26
2004.01.23
Окно отображающее процесс


1-72832
Vuk
2004-01-11 23:14
2004.01.23
Не проходит компиляция при помощи компилятора командной строки.


6-72857
Raptorus
2003-10-02 15:58
2004.01.23
Уважаемые, Мастера. Подскажите как узнать IP-адрес своего компа?


1-72720
LinkFly
2004-01-10 03:01
2004.01.23
Не работает AnsiStrUpper почему???