mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-08 12:07:03 -06:00
78 lines
2.1 KiB
C++
Executable File
78 lines
2.1 KiB
C++
Executable File
// Windows/FileSystem.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "FileSystem.h"
|
|
#include "Defs.h"
|
|
|
|
namespace NWindows {
|
|
namespace NFile {
|
|
namespace NSystem {
|
|
|
|
bool MyGetVolumeInformation(
|
|
LPCTSTR rootPathName,
|
|
CSysString &volumeName,
|
|
LPDWORD volumeSerialNumber,
|
|
LPDWORD maximumComponentLength,
|
|
LPDWORD fileSystemFlags,
|
|
CSysString &fileSystemName)
|
|
{
|
|
bool result = BOOLToBool(GetVolumeInformation(
|
|
rootPathName,
|
|
volumeName.GetBuffer(MAX_PATH), MAX_PATH,
|
|
volumeSerialNumber,
|
|
maximumComponentLength,
|
|
fileSystemFlags,
|
|
fileSystemName.GetBuffer(MAX_PATH), MAX_PATH));
|
|
volumeName.ReleaseBuffer();
|
|
fileSystemName.ReleaseBuffer();
|
|
return result;
|
|
}
|
|
|
|
typedef BOOL (WINAPI * GetDiskFreeSpaceExPointer)(
|
|
LPCTSTR lpDirectoryName, // directory name
|
|
PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
|
|
PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
|
|
PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
|
|
);
|
|
|
|
bool MyGetDiskFreeSpace(LPCTSTR rootPathName,
|
|
UINT64 &clusterSize, UINT64 &totalSize, UINT64 &freeSize)
|
|
{
|
|
GetDiskFreeSpaceExPointer pGetDiskFreeSpaceEx =
|
|
(GetDiskFreeSpaceExPointer)GetProcAddress(
|
|
GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExA");
|
|
|
|
bool sizeIsDetected = false;
|
|
if (pGetDiskFreeSpaceEx)
|
|
{
|
|
UINT64 i64FreeBytesToCaller;
|
|
sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(rootPathName,
|
|
(PULARGE_INTEGER)&i64FreeBytesToCaller,
|
|
(PULARGE_INTEGER)&totalSize,
|
|
(PULARGE_INTEGER)&freeSize));
|
|
}
|
|
|
|
DWORD numSectorsPerCluster;
|
|
DWORD bytesPerSector;
|
|
DWORD numberOfFreeClusters;
|
|
DWORD totalNumberOfClusters;
|
|
|
|
if (!::GetDiskFreeSpace(rootPathName,
|
|
&numSectorsPerCluster,
|
|
&bytesPerSector,
|
|
&numberOfFreeClusters,
|
|
&totalNumberOfClusters))
|
|
return false;
|
|
|
|
clusterSize = UINT64(bytesPerSector) * UINT64(numSectorsPerCluster);
|
|
if (!sizeIsDetected)
|
|
{
|
|
totalSize = clusterSize * UINT64(totalNumberOfClusters);
|
|
freeSize = clusterSize * UINT64(numberOfFreeClusters);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
}}}
|