목적 : 파일을 읽어들여 라인별로 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;







Posted by bloodguy
,