본문 바로가기
Delphi, RadStudio

[개발/delphi] 파일크기/디스크할당크기 구하는 여러가지 방법

by SB리치퍼슨 2012. 1. 7.
[개발/delphi] 파일크기/디스크할당크기 구하는 여러가지 방법

procedure TForm1.FileListBox1Click(Sender: TObject);
var
_DirFileName:String;

FileInfo:integer;
SizeLow, SizeHigh:Dword;

FSectorsPerCluster,
FBytesPerSector,
FNumberOfFreeClusters,
FTotalNumberOfClusters:DWord;

FH : THandle;
FI : TByHandleFileInformation;

begin

_DirFileName := FileListBox1.FileName;

FileInfo := FileOpen(ExTractfilename(_DirFileName), fmOpenRead+fmShareDenyNone);

// 파일 크기 구하는 방법들

// 첫번째 방법
Edit1.Text := IntToStr( GetFileSize(FileInfo, nil) );

// 두번째, 세번째 방법
SizeLow := GetFileSize(FileInfo, @SizeHigh);
Edit2.Text := IntToStr( (SizeHigh shl 32) + SizeLow );
edit3.text := IntToStr((SizeHigh shl 32) or SizeLow);

//네번째 방법
edit4.Text := inttostr(TFileStream.Create(ExTractfilename(_DirFileName), fmOpenRead or fmShareDenyNone).size);
TFileStream.Create(ExTractfilename(_DirFileName), fmOpenRead or fmShareDenyNone).Free;

//다섯번째 방법
Edit5.Text := inttostr( fileseek(FileInfo,0,2) );

// 여섯번째 방법
FH := CreateFile(PChar(_StatusBarWrite), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
try
if FH <> INVALID_HANDLE_VALUE then
begin
if not GetFileInformationByHandle(FH, FI) then Exit;
edit6.Text := inttostr(FI.nFileSizeLow);
end;
finally
CloseHandle(FH);
end;


//클러스터 크기 구해서 파일 할당크기 구하는 방법
// GetDiskFreeSpace() API 호출
GetDiskFreeSpace(
PChar(copy(_StatusBarWrite, 1, 3)), // 디스크 루트 패스
FSectorsPerCluster, // 클러스터당 섹터수
FBytesPerSector, // 섹터당 바이트수
FNumberOfFreeClusters, // 사용하지 않은 클러스터수
FTotalNumberOfClusters // 총 클러스터수
);

//드라이브의 남은 용량 = 섹터당 바이트 X 클러스터당 섹터 X 남은 클러스터 개수
// edit5.Text := formatfloat('###,###,###,###,###', int(FSectorsPerCluster) * int(FBytesPerSector) * int(FNumberOfFreeClusters) );
//드라이브의 총 용량 = 섹터당 바이트 X 클러스터당 섹터 X 총 클러스터 개수
// edit6.Text := FormatFloat('###,###,###,###,###', int(FSectorsPerCluster) * int(FBytesPerSector) * int(FTotalNumberOfClusters) );

edit7.Text := formatfloat('###,###', ceil(GetFileSize(FileInfo, nil) / (int(FSectorsPerCluster) * int(FBytesPerSector))) );
Edit7.Text := FloatToStr (StrToInt(Edit7.Text) * (int(FSectorsPerCluster) * int(FBytesPerSector)) );

end;




user절에 math 유닉 추가[ceil() 함수 사용때문]
어떤 방법이 좋고 나쁘고 차이점 등등은 모르겠습니다.

디스크할당 크기 구할려고 여기 저기 찾고 알아보다 보니
방법이 다양하게 많더라구요.
혹시나 필요하신분 있을것 같아서 올려 드립니다.
반응형

댓글