Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
11-72698
AlexE
2003-05-05 23:36
2004.01.23
Аналог TPageControl в KOL


9-72615
Pandemonium
2003-07-07 09:45
2004.01.23
DelphiXМножество самостоятельных и идентичных друг другу объектов


1-72807
VaZa
2004-01-11 17:11
2004.01.23
Сохранение настроек в EXE


8-72841
AGGRESSOR
2003-09-18 13:17
2004.01.23
Lame_enc.dll


4-72981
Dimaxx
2003-11-15 13:30
2004.01.23
DeviceIOControl + IOCTL_Disk_Format_Tracks_Ex





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