我正在寫一個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風格的應用程序中成功調用此函數嗎?什麼樣的目錄名稱被接受以產生有效的可用空間讀數?
這適用於'LocalFolder',但不適用於'C:\'。即使我讓用戶用文件選取器選擇該文件夾也沒有。我如何獲得所有驅動器的信息? –