본문 바로가기
delphi

델파이에서 파일 사이즈 알아내기

by doran365 2024. 8. 2.

델파이(Delphi)는 다양한 방법으로 파일의 크기를 확인할 수 있는 강력한 프로그래밍 언어입니다. 파일 크기를 확인하는 것은 여러 상황에서 유용하며, 이 글에서는 델파이에서 파일 사이즈를 확인하는 다양한 방법을 소개합니다. 각 방법은 특정 상황에 맞게 사용할 수 있으며, 코드 예제와 함께 설명하겠습니다.

첫 번째 방법: TSearchRec를 이용한 파일 사이즈 확인

TSearchRec 구조체 사용

TSearchRec 구조체를 사용하여 파일의 크기를 확인할 수 있습니다. 이 방법은 간단하고 효율적이며, 파일의 크기를 바이트 단위로 반환합니다.

function FileSize(fileName : wideString) : Int64;
var
  sr : TSearchRec;
begin
  if FindFirst(fileName, faAnyFile, sr) = 0 then
    result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow)
  else
    result := -1;

  FindClose(sr);
end;

설명

위 코드에서 FindFirst 함수는 지정된 파일을 찾고, TSearchRec 구조체를 통해 파일 정보를 가져옵니다. 파일 크기는 nFileSizeHigh와 nFileSizeLow 필드를 조합하여 얻습니다. 파일을 찾지 못하면 -1을 반환합니다.

두 번째 방법: 파일을 열어 크기 확인

파일 핸들을 사용하여 파일 사이즈 확인

이 방법은 파일을 직접 열고, 파일 크기를 확인하는 방법입니다. 예외 처리를 통해 파일이 열리지 않는 경우도 처리할 수 있습니다.

function GetFileSize(AFileName: string; ASkip: boolean = false): Integer;
var
  f: file of Byte;
  size: Longint;
  flag: boolean;
begin
  flag := false;
  while not flag do
  begin
    Application.ProcessMessages;
    if FStopFlag then
      break;

    if FileExists(AFileName) then
    begin
      try
        size := 0;
        AssignFile(f, AFileName);
        reset(f);
        size := FileSize(f);
        CloseFile(f);
        flag := true;
      except
        on e:Exception do
        begin
          flag := ASkip;
          size := -1;
        end;
      end;
    end;
  end;
  result := size;
end;

설명

이 코드에서는 파일이 존재하는지 확인한 후, 파일을 열고 크기를 확인합니다. 예외가 발생할 경우 파일 크기를 -1로 설정하며, flag 변수를 사용하여 반복을 제어합니다.

세 번째 방법: 다양한 방법을 사용한 파일 사이즈 확인

Get_File_Size1: CreateFile 함수 사용

function Get_File_Size1(sFileToExamine: string; bInKBytes: Boolean): string;
var
  FileHandle: THandle;
  FileSize: LongWord;
  d1: Double;
  i1: Int64;
begin
  FileHandle := CreateFile(PChar(sFileToExamine),
    GENERIC_READ,
    0, {exclusive}
    nil, {security}
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);
  FileSize := GetFileSize(FileHandle, nil);
  Result := IntToStr(FileSize);
  CloseHandle(FileHandle);
  
  if bInKbytes = True then
  begin
    if Length(Result) > 3 then
    begin
      Insert('.', Result, Length(Result) - 2);
      d1 := StrToFloat(Result);
      Result := IntToStr(round(d1)) + 'KB';
    end
    else
      Result := '1KB';
  end;
end;

설명

이 함수는 CreateFile 함수를 사용하여 파일을 열고, GetFileSize 함수를 통해 파일 크기를 확인합니다. bInKBytes 매개변수를 통해 결과를 킬로바이트 단위로 반환할지 여부를 설정할 수 있습니다.

Get_File_Size2: TSearchRec와 FindFirst 함수 사용

function Get_File_Size2(sFileToExamine: string; bInKBytes: Boolean): string;
var
  SearchRec: TSearchRec;
  sgPath: string;
  inRetval, I1: Integer;
begin
  sgPath := ExpandFileName(sFileToExamine);
  try
    inRetval := FindFirst(ExpandFileName(sFileToExamine), faAnyFile, SearchRec);
    if inRetval = 0 then
      I1 := SearchRec.Size
    else
      I1 := -1;
  finally
    SysUtils.FindClose(SearchRec);
  end;
  Result := IntToStr(I1);
end;

설명

이 함수는 첫 번째 방법과 유사하게 TSearchRec 구조체를 사용하여 파일의 크기를 확인합니다. 다만, 파일 경로를 확장한 후 FindFirst 함수를 호출합니다.

네 번째 방법: Win32 API 사용

Get_File_Size3: TWin32FindData 구조체 사용

function Get_File_Size3(const FileName: string): TULargeInteger;
var
  Find: THandle;
  Data: TWin32FindData;
begin
  Result.QuadPart := -1;
  Find := FindFirstFile(PChar(FileName), Data);
  if (Find <> INVALID_HANDLE_VALUE) then
  begin
    Result.LowPart := Data.nFileSizeLow;
    Result.HighPart := Data.nFileSizeHigh;
    Windows.FindClose(Find);
  end;
end;

설명

이 함수는 Win32 API를 사용하여 파일 크기를 확인합니다. FindFirstFile 함수를 호출하여 파일 정보를 가져오고, TWin32FindData 구조체를 통해 파일 크기를 얻습니다.

Get_File_Size4: Win32 API를 이용한 또 다른 방법

function Get_File_Size4(const S: string): Int64;
var
  FD: TWin32FindData;
  FH: THandle;
begin
  FH := FindFirstFile(PChar(S), FD);
  if FH = INVALID_HANDLE_VALUE then Result := 0
  else
    try
      Result := FD.nFileSizeHigh;
      Result := Result shl 32;
      Result := Result + FD.nFileSizeLow;
    finally
      CloseHandle(FH);
    end;
end;

설명

이 방법도 Win32 API를 사용하며, FindFirstFile과 TWin32FindData 구조체를 사용하여 파일 크기를 확인합니다. 파일 크기를 확인한 후 핸들을 닫아줍니다.

 

결론

델파이에서 파일 사이즈를 확인하는 방법은 다양하며, 각 방법은 특정 상황에 맞게 사용될 수 있습니다. TSearchRec 구조체, 파일 핸들, Win32 API 등을 사용하여 파일 크기를 효율적으로 확인할 수 있습니다. 각 방법의 코드 예제를 참고하여 자신에게 맞는 방법을 선택해 사용하시기 바랍니다.