2012-06-21 40 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

相关问题