Home | History | Annotate | Download | only in Windows
      1 // Windows/FileSystem.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #ifndef UNDER_CE
      6 
      7 #ifndef _UNICODE
      8 #include "../Common/StringConvert.h"
      9 #endif
     10 
     11 #include "FileSystem.h"
     12 #include "Defs.h"
     13 
     14 #ifndef _UNICODE
     15 extern bool g_IsNT;
     16 #endif
     17 
     18 namespace NWindows {
     19 namespace NFile {
     20 namespace NSystem {
     21 
     22 bool MyGetVolumeInformation(
     23     CFSTR rootPath,
     24     UString &volumeName,
     25     LPDWORD volumeSerialNumber,
     26     LPDWORD maximumComponentLength,
     27     LPDWORD fileSystemFlags,
     28     UString &fileSystemName)
     29 {
     30   BOOL res;
     31   #ifndef _UNICODE
     32   if (!g_IsNT)
     33   {
     34     TCHAR v[MAX_PATH + 2]; v[0] = 0;
     35     TCHAR f[MAX_PATH + 2]; f[0] = 0;
     36     res = GetVolumeInformation(fs2fas(rootPath),
     37         v, MAX_PATH,
     38         volumeSerialNumber, maximumComponentLength, fileSystemFlags,
     39         f, MAX_PATH);
     40     volumeName = MultiByteToUnicodeString(v);
     41     fileSystemName = MultiByteToUnicodeString(f);
     42   }
     43   else
     44   #endif
     45   {
     46     WCHAR v[MAX_PATH + 2]; v[0] = 0;
     47     WCHAR f[MAX_PATH + 2]; f[0] = 0;
     48     res = GetVolumeInformationW(fs2us(rootPath),
     49         v, MAX_PATH,
     50         volumeSerialNumber, maximumComponentLength, fileSystemFlags,
     51         f, MAX_PATH);
     52     volumeName = v;
     53     fileSystemName = f;
     54   }
     55   return BOOLToBool(res);
     56 }
     57 
     58 UINT MyGetDriveType(CFSTR pathName)
     59 {
     60   #ifndef _UNICODE
     61   if (!g_IsNT)
     62   {
     63     return GetDriveType(fs2fas(pathName));
     64   }
     65   else
     66   #endif
     67   {
     68     return GetDriveTypeW(fs2us(pathName));
     69   }
     70 }
     71 
     72 typedef BOOL (WINAPI * GetDiskFreeSpaceExA_Pointer)(
     73   LPCSTR lpDirectoryName,                  // directory name
     74   PULARGE_INTEGER lpFreeBytesAvailable,    // bytes available to caller
     75   PULARGE_INTEGER lpTotalNumberOfBytes,    // bytes on disk
     76   PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
     77 );
     78 
     79 typedef BOOL (WINAPI * GetDiskFreeSpaceExW_Pointer)(
     80   LPCWSTR lpDirectoryName,                 // directory name
     81   PULARGE_INTEGER lpFreeBytesAvailable,    // bytes available to caller
     82   PULARGE_INTEGER lpTotalNumberOfBytes,    // bytes on disk
     83   PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
     84 );
     85 
     86 bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize)
     87 {
     88   DWORD numSectorsPerCluster, bytesPerSector, numFreeClusters, numClusters;
     89   bool sizeIsDetected = false;
     90   #ifndef _UNICODE
     91   if (!g_IsNT)
     92   {
     93     GetDiskFreeSpaceExA_Pointer pGetDiskFreeSpaceEx = (GetDiskFreeSpaceExA_Pointer)GetProcAddress(
     94         GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExA");
     95     if (pGetDiskFreeSpaceEx)
     96     {
     97       ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2;
     98       sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(fs2fas(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2));
     99       totalSize = totalSize2.QuadPart;
    100       freeSize = freeSize2.QuadPart;
    101     }
    102     if (!::GetDiskFreeSpace(fs2fas(rootPath), &numSectorsPerCluster, &bytesPerSector, &numFreeClusters, &numClusters))
    103       return false;
    104   }
    105   else
    106   #endif
    107   {
    108     GetDiskFreeSpaceExW_Pointer pGetDiskFreeSpaceEx = (GetDiskFreeSpaceExW_Pointer)GetProcAddress(
    109         GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExW");
    110     if (pGetDiskFreeSpaceEx)
    111     {
    112       ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2;
    113       sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(fs2us(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2));
    114       totalSize = totalSize2.QuadPart;
    115       freeSize = freeSize2.QuadPart;
    116     }
    117     if (!::GetDiskFreeSpaceW(fs2us(rootPath), &numSectorsPerCluster, &bytesPerSector, &numFreeClusters, &numClusters))
    118       return false;
    119   }
    120   clusterSize = (UInt64)bytesPerSector * (UInt64)numSectorsPerCluster;
    121   if (!sizeIsDetected)
    122   {
    123     totalSize = clusterSize * (UInt64)numClusters;
    124     freeSize = clusterSize * (UInt64)numFreeClusters;
    125   }
    126   return true;
    127 }
    128 
    129 }}}
    130 
    131 #endif
    132