2011년 3월 15일 화요일

텍스트 파일읽기 비교

목적 : 파일을 읽어들여 라인별로 StringList 에 저장하는 것


1. FileStream : 빠르다. 라인수도 줄일 수 있다. (사실 Readln 빼고는 거의 동일한 수준)

procedureTest_FileStream;
var
FileStream: TFileStream;
sList: TStringList;
begin sList:=TStringList.Create;
FileStream:=TFileStream.Create(FILE_NAME, fmShareDenyNone);
try
sList.LoadFromStream(FileStream);
finally
FreeAndNil(FileStream);
FreeAndNil(sList);
end;
end;



2. Readln : 두배 이상 느리다. 라인수도 늘어난다. 왜 쓰는지 의문이다...

procedureTest_Readln;
var
Line: String;
sList: TStringList;
f: TextFile;
begin sList:=TStringList.Create;
try
AssignFile(f, FILE_NAME);
Reset(f);
while notEOF(f) do begin
Readln(f, Line);
sList.Add(Line)
end;
finally
CloseFile(f);
FreeAndNil(sList);
end;
end;



3. StringList.LoadFromFile : 가장 빠른편. (어차피 내부적으로 Stream 을 이용) 라인수가 가장 작다.

procedureTest_LoadFromFile;
var
sList: TStringList;
begin
sList:=TStringList.Create;
try sList.LoadFromFile(FILE_NAME);
finally
FreeAndNil(sList);
end;
end;



4. API : 속도는 별반 차이 없음. CreateFile, ReadFile 이용한다는 점이 특이사항.

procedureTest_API;
var
sList: TStringList;
hFile: THandle;
FileSize, ReadSize: Cardinal;
Buffer: String;

begin
sList:=TStringList.Create;
try
hFile:=CreateFile(PChar(FILE_NAME), GENERIC_READ,
FILE_SHARE_READ orFILE_SHARE_WRITEorFILE_SHARE_DELETE,
nil, OPEN_EXISTING, 0, 0);
FileSize:=GetFileSize(hFile,nil);
SetLength(Buffer, FileSize);
ifReadFile(hFile, Buffer[1], FileSize, ReadSize, nil) thensList.Text:=Buffer;
finally
CloseHandle(hfile);
FreeAndNil(sList);
end;
end;



5. BlockRead : 역시 속도는 그다지 차이 없음. BlockRead 함수를 사용한다는 게 특이점.

procedureTest_BlockRead;
var
sList: TStringList;
f: File;
FileSize, ReadSize: Cardinal;
SearchRec: TSearchRec;
Buffer: String;

begin
sList:=TStringList.Create;
try FileSize:=0;
ifFindFirst(FILE_NAME, faAnyFile, SearchRec)=0 then begin
FileSize:=SearchRec.Size;
FindClose(SearchRec);
end;

AssignFile(f, FILE_NAME);
SetLength(Buffer, FileSize);
Reset(f, 1);
BlockRead(f, PChar(Buffer)^, FileSize, ReadSize);

sList.Text:=Buffer;
finally
CloseFile(f);
FreeAndNil(sList);
end;
end;

댓글 없음:

댓글 쓰기