从 UWP (C#) 调用 GetDiskFreeSpaceExA

Call GetDiskFreeSpaceExA from UWP (C#)

我正在开发一个 UWP 应用程序(C#,Visual Studio 2019),我想找出对用户免费和免费 space C: 的总数。为此,我想调用 GetDiskFreeSpaceExA(关于 GetDiskFreeSpaceExA:https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdiskfreespaceexa)。

我尝试了以下方法:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
 [return: MarshalAs(UnmanagedType.Bool)]
 static extern bool GetDiskFreeSpaceExA(string path,
                                        out ulong freeBytesForUser,
                                        out ulong totalNumberOfBytes,
                                        out ulong totalNumberOfFreeBytes);

然后,我调用 GetDiskFreeSpaceExA:

ulong freeUser;
ulong total;
ulong free;
string pathC= @"C:\"; // also tried with "C:\" and @"C:\"
bool success =  GetDiskFreeSpaceExA(pathC,
                                    out freeUser,
                                    out total,
                                    out free);

if(success)
{
     // ...
}

成功 总是错误的。为什么?如何从 UWP 中找出 C: 上的 space?我知道有一些 C# 方法,但我想要 DLL。

谢谢!

您可以在 Package.appxmanifest 中添加 broadFileSystemAccess 功能。 这是一个受限的能力。可在 设置 > 隐私 > 文件系统中配置访问权限。

请参考以下代码

Package.appxmanifest:

<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"   

 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap mp rescap">
……
 <Capabilities>
   <rescap:Capability Name="broadFileSystemAccess" />
   <Capability Name="internetClient" />   
 </Capabilities>

后面的代码:

public async void test()
    {

        const String k_freeSpace = "System.FreeSpace";
        const String k_totalSpace = "System.Capacity";

        try
            {
               
                StorageFolder folder = await StorageFolder.GetFolderFromPathAsync("C:\");
                var props = await folder.Properties.RetrievePropertiesAsync(new string[] { k_freeSpace, k_totalSpace });
                Debug.WriteLine("FreeSpace: " + (UInt64)props[k_freeSpace]);
                Debug.WriteLine("Capacity:  " + (UInt64)props[k_totalSpace]);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(String.Format("Couldn't get info for drive C."));
            }
        
    }