본문 바로가기
Delphi Tip/파일

텍스트 파일읽기 비교

by MonoSoft 2021. 10. 5.
728x90
반응형

텍스트 파일읽기 비교

 

 

 

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

 

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

procedure Test_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 : 두배 이상 느리다. 라인수도 늘어난다. 왜 쓰는지 의문이다...

procedure Test_Readln;

var

Line: String;

sList: TStringList;

f: TextFile;

begin

sList:=TStringList.Create;

try

AssignFile(f, FILE_NAME);

Reset(f);

while not EOF(f) do begin

Readln(f, Line);

sList.Add(Line)

end;

finally

CloseFile(f);

FreeAndNil(sList);

end;

end;

 

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

procedure Test_LoadFromFile;

var

sList: TStringList;

begin

sList:=TStringList.Create;

try

sList.LoadFromFile(FILE_NAME);

finally

FreeAndNil(sList);

end;

end;

 

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

procedure Test_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 or FILE_SHARE_WRITE or FILE_SHARE_DELETE,

nil, OPEN_EXISTING, 0, 0);

FileSize:=GetFileSize(hFile, nil);

SetLength(Buffer, FileSize);

if ReadFile(hFile, Buffer[1], FileSize, ReadSize, nil) then sList.Text:=Buffer;

finally

CloseHandle(hfile);

FreeAndNil(sList);

end;

end;

 

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

procedure Test_BlockRead;

var

sList: TStringList;

f: File;

FileSize, ReadSize: Cardinal;

SearchRec: TSearchRec;

Buffer: String;

begin

sList:=TStringList.Create;

try

FileSize:=0;

if FindFirst(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;

 

 

728x90
반응형

'Delphi Tip > 파일' 카테고리의 다른 글

파일 경로/이름/확장자 등 알아내기  (0) 2021.10.07
Unix파일 (.sam) 델파이에서 읽기 방법  (0) 2021.10.06
델파이 파일복사 방법  (0) 2021.10.01
파일크기 구하기  (0) 2021.09.30
ini 파일 읽기/생성  (0) 2021.09.29

댓글