mirror of
https://github.com/holub/mame
synced 2025-04-30 11:50:30 +03:00
132 lines
3.7 KiB
C++
132 lines
3.7 KiB
C++
// 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
|