천객만래 [千客萬來] (It has an interminable succession of visitors)

// 파일크기 구하기 (2G이상도 구함)
HANDLE   hFile;
hFile = ::CreateFile(FilePath, 0, 0 , NULL, OPEN_EXISTING, 0, NULL);
PLARGE_INTEGER pLint;
if (INVALID_FILE_SIZE != ::GetFileSizeEx(hFile, pLint))
{
// 64bit
pLint->QuadPart;
// 32bit
pLint->LowPart;
}

출처: http://msdn.microsoft.com/en-us/library/aa383713(VS.85).aspx
 
* LARGE_INTEGER Union

멤버 설명은 다음과 같습니다. 64bit는 QuadPart를 사용하고 32bit는 나머지를 사용합니다.

Members
LowPart
Low-order 32 bits.

HighPart
High-order 32 bits.

u
LowPart
Low-order 32 bits.

HighPart
High-order 32 bits.

QuadPart
Signed 64-bit integer.


그래서 이렇게 사용하면 되겠습니다.

PLARGE_INTEGER pLargeInteger;
HANDLE   hFile;
hFile = ::CreateFile(FilePath, 0, 0 , NULL, OPEN_EXISTING, 0, NULL);
if ( INVALID_FILE_SIZE != ::GetFileSizeEx(hFile, pLargeInteger) )
{
   // 64bit인 경우
    printf("64bit file size = %d\n", pLargeInteger.QuadPart );

   // 32bit인 경우
    printf("32bit file size = %d\n", pLargeInteger.LowPart );
}


파일 관련 함수 링크

File Management Functions
http://msdn.microsoft.com/en-us/library/aa364232(VS.85).aspx

- GetFileSize()
http://msdn.microsoft.com/en-us/library/aa364955(VS.85).aspx

- GetFileSizeEx()
http://msdn.microsoft.com/en-us/library/aa364957(VS.85).aspx



Posted by SB패밀리
[개발/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() 함수 사용때문]
어떤 방법이 좋고 나쁘고 차이점 등등은 모르겠습니다.

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