Source code
Revision control
Copy as Markdown
Other Tools
// Windows/FileSystem.cpp↩
↩
#include "StdAfx.h"↩
↩
#ifndef UNDER_CE↩
↩
#ifndef _UNICODE↩
#include "../Common/StringConvert.h"↩
#endif↩
↩
#include "FileSystem.h"↩
#include "Defs.h"↩
↩
#ifndef _UNICODE↩
extern bool g_IsNT;↩
#endif↩
↩
namespace NWindows {↩
namespace NFile {↩
namespace NSystem {↩
↩
bool MyGetVolumeInformation(↩
CFSTR rootPath,↩
UString &volumeName,↩
LPDWORD volumeSerialNumber,↩
LPDWORD maximumComponentLength,↩
LPDWORD fileSystemFlags,↩
UString &fileSystemName)↩
{↩
BOOL res;↩
#ifndef _UNICODE↩
if (!g_IsNT)↩
{↩
TCHAR v[MAX_PATH + 2]; v[0] = 0;↩
TCHAR f[MAX_PATH + 2]; f[0] = 0;↩
res = GetVolumeInformation(fs2fas(rootPath),↩
v, MAX_PATH,↩
volumeSerialNumber, maximumComponentLength, fileSystemFlags,↩
f, MAX_PATH);↩
volumeName = MultiByteToUnicodeString(v);↩
fileSystemName = MultiByteToUnicodeString(f);↩
}↩
else↩
#endif↩
{↩
WCHAR v[MAX_PATH + 2]; v[0] = 0;↩
WCHAR f[MAX_PATH + 2]; f[0] = 0;↩
res = GetVolumeInformationW(fs2us(rootPath),↩
v, MAX_PATH,↩
volumeSerialNumber, maximumComponentLength, fileSystemFlags,↩
f, MAX_PATH);↩
volumeName = v;↩
fileSystemName = f;↩
}↩
return BOOLToBool(res);↩
}↩
↩
UINT MyGetDriveType(CFSTR pathName)↩
{↩
#ifndef _UNICODE↩
if (!g_IsNT)↩
{↩
return GetDriveType(fs2fas(pathName));↩
}↩
else↩
#endif↩
{↩
return GetDriveTypeW(fs2us(pathName));↩
}↩
}↩
↩
typedef BOOL (WINAPI * GetDiskFreeSpaceExA_Pointer)(↩
LPCSTR lpDirectoryName, // directory name↩
PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller↩
PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk↩
PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk↩
);↩
↩
typedef BOOL (WINAPI * GetDiskFreeSpaceExW_Pointer)(↩
LPCWSTR 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(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize)↩
{↩
DWORD numSectorsPerCluster, bytesPerSector, numFreeClusters, numClusters;↩
bool sizeIsDetected = false;↩
#ifndef _UNICODE↩
if (!g_IsNT)↩
{↩
GetDiskFreeSpaceExA_Pointer pGetDiskFreeSpaceEx = (GetDiskFreeSpaceExA_Pointer)GetProcAddress(↩
GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExA");↩
if (pGetDiskFreeSpaceEx)↩
{↩
ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2;↩
sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(fs2fas(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2));↩
totalSize = totalSize2.QuadPart;↩
freeSize = freeSize2.QuadPart;↩
}↩
if (!::GetDiskFreeSpace(fs2fas(rootPath), &numSectorsPerCluster, &bytesPerSector, &numFreeClusters, &numClusters))↩
return false;↩
}↩
else↩
#endif↩
{↩
GetDiskFreeSpaceExW_Pointer pGetDiskFreeSpaceEx = (GetDiskFreeSpaceExW_Pointer)GetProcAddress(↩
GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExW");↩
if (pGetDiskFreeSpaceEx)↩
{↩
ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2;↩
sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(fs2us(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2));↩
totalSize = totalSize2.QuadPart;↩
freeSize = freeSize2.QuadPart;↩
}↩
if (!::GetDiskFreeSpaceW(fs2us(rootPath), &numSectorsPerCluster, &bytesPerSector, &numFreeClusters, &numClusters))↩
return false;↩
}↩
clusterSize = (UInt64)bytesPerSector * (UInt64)numSectorsPerCluster;↩
if (!sizeIsDetected)↩
{↩
totalSize = clusterSize * (UInt64)numClusters;↩
freeSize = clusterSize * (UInt64)numFreeClusters;↩
}↩
return true;↩
}↩
↩
}}}↩
↩
#endif↩