bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree) { #if defined(HAVE_STATFS) || defined(HAVE_STATVFS) // the case to "char *" is needed for AIX 4.3 wxStatfs_t fs; if ( wxStatfs((char *)(const char*)path.fn_str(), &fs) != 0 ) { wxLogSysError( wxT("Failed to get file system statistics") ); return false; } // under Solaris we also have to use f_frsize field instead of f_bsize // which is in general a multiple of f_frsize #ifdef HAVE_STATVFS wxDiskspaceSize_t blockSize = fs.f_frsize; #else // HAVE_STATFS wxDiskspaceSize_t blockSize = fs.f_bsize; #endif // HAVE_STATVFS/HAVE_STATFS if ( pTotal ) { *pTotal = wxDiskspaceSize_t(fs.f_blocks) * blockSize; } if ( pFree ) { *pFree = wxDiskspaceSize_t(fs.f_bavail) * blockSize; } return true; #else // !HAVE_STATFS && !HAVE_STATVFS return false; #endif // HAVE_STATFS }
bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pTotal), wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pFree)) { #ifdef __WXWINCE__ // TODO-CE return false; #else if ( path.empty() ) return false; ULARGE_INTEGER bytesFree, bytesTotal; // may pass the path as is, GetDiskFreeSpaceEx() is smart enough if ( !::GetDiskFreeSpaceEx(path.t_str(), &bytesFree, &bytesTotal, NULL) ) { wxLogLastError(wxT("GetDiskFreeSpaceEx")); return false; } // ULARGE_INTEGER is a union of a 64 bit value and a struct containing // two 32 bit fields which may be or may be not named - try to make it // compile in all cases #if defined(__BORLANDC__) && !defined(_ANONYMOUS_STRUCT) #define UL(ul) ul.u #else // anon union #define UL(ul) ul #endif if ( pTotal ) { #if wxUSE_LONGLONG *pTotal = wxDiskspaceSize_t(UL(bytesTotal).HighPart, UL(bytesTotal).LowPart); #else *pTotal = wxDiskspaceSize_t(UL(bytesTotal).LowPart); #endif } if ( pFree ) { #if wxUSE_LONGLONG *pFree = wxLongLong(UL(bytesFree).HighPart, UL(bytesFree).LowPart); #else *pFree = wxDiskspaceSize_t(UL(bytesFree).LowPart); #endif } return true; #endif // __WXWINCE__ }
bool wxGetDiskSpace(const wxString& WXUNUSED_IN_WINCE(path), wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pTotal), wxDiskspaceSize_t *WXUNUSED_IN_WINCE(pFree)) { #ifdef __WXWINCE__ // TODO-CE return false; #else if ( path.empty() ) return false; // old w32api don't have ULARGE_INTEGER #if defined(__WIN32__) && \ (!defined(__GNUWIN32__) || wxCHECK_W32API_VERSION( 0, 3 )) // GetDiskFreeSpaceEx() is not available under original Win95, check for // it typedef BOOL (WINAPI *GetDiskFreeSpaceEx_t)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); GetDiskFreeSpaceEx_t pGetDiskFreeSpaceEx = (GetDiskFreeSpaceEx_t)::GetProcAddress ( ::GetModuleHandle(_T("kernel32.dll")), #if wxUSE_UNICODE "GetDiskFreeSpaceExW" #else "GetDiskFreeSpaceExA" #endif ); if ( pGetDiskFreeSpaceEx ) { ULARGE_INTEGER bytesFree, bytesTotal; // may pass the path as is, GetDiskFreeSpaceEx() is smart enough if ( !pGetDiskFreeSpaceEx(path, &bytesFree, &bytesTotal, NULL) ) { wxLogLastError(_T("GetDiskFreeSpaceEx")); return false; } // ULARGE_INTEGER is a union of a 64 bit value and a struct containing // two 32 bit fields which may be or may be not named - try to make it // compile in all cases #if defined(__BORLANDC__) && !defined(_ANONYMOUS_STRUCT) #define UL(ul) ul.u #else // anon union #define UL(ul) ul #endif if ( pTotal ) { #if wxUSE_LONGLONG *pTotal = wxDiskspaceSize_t(UL(bytesTotal).HighPart, UL(bytesTotal).LowPart); #else *pTotal = wxDiskspaceSize_t(UL(bytesTotal).LowPart); #endif } if ( pFree ) { #if wxUSE_LONGLONG *pFree = wxLongLong(UL(bytesFree).HighPart, UL(bytesFree).LowPart); #else *pFree = wxDiskspaceSize_t(UL(bytesFree).LowPart); #endif } } else #endif // Win32 { // there's a problem with drives larger than 2GB, GetDiskFreeSpaceEx() // should be used instead - but if it's not available, fall back on // GetDiskFreeSpace() nevertheless... DWORD lSectorsPerCluster, lBytesPerSector, lNumberOfFreeClusters, lTotalNumberOfClusters; // FIXME: this is wrong, we should extract the root drive from path // instead, but this is the job for wxFileName... if ( !::GetDiskFreeSpace(path, &lSectorsPerCluster, &lBytesPerSector, &lNumberOfFreeClusters, &lTotalNumberOfClusters) ) { wxLogLastError(_T("GetDiskFreeSpace")); return false; } wxDiskspaceSize_t lBytesPerCluster = (wxDiskspaceSize_t) lSectorsPerCluster; lBytesPerCluster *= lBytesPerSector; if ( pTotal ) { *pTotal = lBytesPerCluster; *pTotal *= lTotalNumberOfClusters; } if ( pFree ) { *pFree = lBytesPerCluster; *pFree *= lNumberOfFreeClusters; } } return true; #endif // __WXWINCE__ }