#include "StdAfx.h"
#include "FileSystem.h"
#include "Defs.h"
#ifndef _UNICODE
extern
bool
g_IsNT;
#endif
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;
}
#ifndef _UNICODE
bool
MyGetVolumeInformation(
LPCWSTR
rootPathName,
UString &volumeName,
LPDWORD
volumeSerialNumber,
LPDWORD
maximumComponentLength,
LPDWORD
fileSystemFlags,
UString &fileSystemName)
{
if
(g_IsNT)
{
bool
result = BOOLToBool(GetVolumeInformationW(
rootPathName,
volumeName.GetBuffer(MAX_PATH), MAX_PATH,
volumeSerialNumber,
maximumComponentLength,
fileSystemFlags,
fileSystemName.GetBuffer(MAX_PATH), MAX_PATH));
volumeName.ReleaseBuffer();
fileSystemName.ReleaseBuffer();
return
result;
}
AString volumeNameA, fileSystemNameA;
bool
result = MyGetVolumeInformation(GetSystemString(rootPathName), volumeNameA,
volumeSerialNumber, maximumComponentLength, fileSystemFlags,fileSystemNameA);
if
(result)
{
volumeName = GetUnicodeString(volumeNameA);
fileSystemName = GetUnicodeString(fileSystemNameA);
}
return
result;
}
#endif
typedef
BOOL
(WINAPI * GetDiskFreeSpaceExPointer)(
LPCTSTR
lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailable,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes
);
bool
MyGetDiskFreeSpace(
LPCTSTR
rootPathName,
UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize)
{
GetDiskFreeSpaceExPointer pGetDiskFreeSpaceEx =
(GetDiskFreeSpaceExPointer)GetProcAddress(
GetModuleHandle(TEXT(
"kernel32.dll"
)),
"GetDiskFreeSpaceExA"
);
bool
sizeIsDetected =
false
;
if
(pGetDiskFreeSpaceEx)
{
ULARGE_INTEGER i64FreeBytesToCaller, totalSize2, freeSize2;
sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(rootPathName,
&i64FreeBytesToCaller,
&totalSize2,
&freeSize2));
totalSize = totalSize2.QuadPart;
freeSize = freeSize2.QuadPart;
}
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
;
}
#ifndef _UNICODE
bool
MyGetDiskFreeSpace(
LPCWSTR
rootPathName,
UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize)
{
return
MyGetDiskFreeSpace(GetSystemString(rootPathName), clusterSize, totalSize, freeSize);
}
#endif
}}}