2012-06-21 39 views
0

我正在寫一個Metro風格的應用程序,並且想要確定承載用戶音樂庫的驅動器的可用存儲容量。我想禁用一些應用程序功能,但磁盤上沒有剩餘空間或空間不足。我使用P/Invoke來調用GetDiskFreeSpaceExW並獲取錯誤並且沒有有效的字節數。無法從Metro風格的應用程序中獲取可用磁盤空間

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool GetDiskFreeSpaceExW(
    string lpDirectoryName, 
    out ulong lpFreeBytesAvailable, 
    out ulong lpTotalNumberOfBytes, 
    out ulong lpTotalNumberOfFreeBytes 
); 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern int GetLastError(); 

async static void TestDiskSpace() 
{ 
    IStorageFolder musicFolder = KnownFolders.MusicLibrary; 
    IStorageFolder testFolder = await musicFolder.CreateFolderAsync("test", CreationCollisionOption.OpenIfExists); 
    IStorageFolder appFolder = ApplicationData.Current.LocalFolder; 
    ulong a, b, c; 
    string[] paths = new[] 
    { 
     null, 
     "." 
     "C:", 
     "C:\\", 
     "C:\\Users\\Jonas\\Music", 
     "C:\\Users\\Jonas\\Music\\", 
     musicFolder.Path, 
     testFolder.Path, 
     appFolder.Path 
    }; 
    foreach(string path in paths) 
    { 
     GetDiskFreeSpaceExW(path, out a, out b, out c); 
     int error = GetLastError(); 
     Debug.WriteLine(
     string.Format("{0} - Error {1} - free = {2}", 
     path ?? "null", error, a)); 
    } 
} 

調試輸出:

null - Error 5 - free = 0 
. - Error 123 - free = 0 
C: - Error 3 - free = 0 
C:\ - Error 3 - free = 0 
C:\Users\J909\Music - Error 3 - free = 0 
C:\Users\J909\Music\ - Error 3 - free = 0 
- Error 3 - free = 0 
C:\Users\J909\Music\test - Error 123 - free = 0 
C:\Users\J909\AppData\Local\Packages\long-app-id\LocalState - Error 123 - free = 0 

看來我提供了錯誤的輸入。錯誤代碼爲3:ERROR_PATH_NOT_FOUND,5:ERROR_ACCESS_DENIED,123:ERROR_INVALID_NAME。我在Windows 8 RP(x64)上使用VS Ultimate 2012 RC運行此代碼,這是從Metro風格的應用程序調用的。我的應用程序被授予訪問用戶音樂庫的權限。

有人設法從Metro風格的應用程序中成功調用此函數嗎?什麼樣的目錄名稱被接受以產生有效的可用空間讀數?

回答

4

我創建的代碼的基礎上Win32 and COM documentation for Metro這個問題。它調用了GetDiskFreeSpaceExW是在地鐵可用,但採用p託管的應用程序/調用需要調用GetDiskFreeSpaceEx代替:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool GetDiskFreeSpaceEx(
    string lpDirectoryName, 
    out ulong lpFreeBytesAvailable, 
    out ulong lpTotalNumberOfBytes, 
    out ulong lpTotalNumberOfFreeBytes); 

static void TestDiskSpace() 
{ 
    IStorageFolder appFolder = ApplicationData.Current.LocalFolder; 
    ulong a, b, c; 
    if(GetDiskFreeSpaceEx(appFolder.Path, out a, out b, out c)) 
     Debug.WriteLine(string.Format("{0} bytes free", a)); 
} 
+0

這適用於'LocalFolder',但不適用於'C:\'。即使我讓用戶用文件選取器選擇該文件夾也沒有。我如何獲得所有驅動器的信息? –

0

你可能有更好的運氣與

long free = new DriveInfo(driveName).TotalFreeSpace; 
+0

的[System.IO命名空間(http://msdn.microsoft.com/en -us/library/windows/apps/hh454050(v = vs.110).aspx)的Metro風格應用程序不包含DriveInfo類。 – J909

相關問題