从 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."));
}
}
我正在开发一个 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."));
}
}