본문 바로가기
Delphi Tip/파일

텍스트 파일읽기 비교

by MonoSoft 2021. 9. 27.
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 > 파일' 카테고리의 다른 글

텍스트 파일읽기 비교  (1) 2021.10.05
델파이 파일복사 방법  (0) 2021.10.01
파일크기 구하기  (0) 2021.09.30
ini 파일 읽기/생성  (0) 2021.09.29
UTF-8 인코딩 파일 읽기  (0) 2021.09.28

댓글