Files
easy7zip/Windows/FileSystem.cpp
Igor Pavlov 8c1b5c7b7e 3.13
2016-05-28 00:15:41 +01:00

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;
}
}}}