在 Windows 8 中使用 C# 的 WinRT 中的磁盘空间

本文关键字:WinRT 磁盘 空间 Windows | 更新日期: 2023-09-27 18:36:18

我有两个解决方案,但这两个解决方案对我来说都没有用。

解决方案 1:kernel32.dll(其工作代码)

注意:但我不想在我的应用程序中导入任何dll。 b/c 它在市场提交方面的问题。

[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));
}

解决方案 2:使用 DriveInfo 类(不适用于 WinRT 的代码)

注意:WinRT 开发中缺少命名空间。对于 Windows 8 开发,WinRT 不支持此类。

DriveInfo[] allDrives = DriveInfo.GetDrives();
    foreach (DriveInfo d in allDrives)
    {
        Console.WriteLine("Drive {0}", d.Name);
        Console.WriteLine("  File type: {0}", d.DriveType);
        if (d.IsReady == true)
        {
            Console.WriteLine("  Volume label: {0}", d.VolumeLabel);
            Console.WriteLine("  File system: {0}", d.DriveFormat);
            Console.WriteLine(
                "  Available space to current user:{0, 15} bytes", 
                d.AvailableFreeSpace);
            Console.WriteLine(
                "  Total available space:          {0, 15} bytes",
                d.TotalFreeSpace);
            Console.WriteLine(
                "  Total size of drive:            {0, 15} bytes ",
                d.TotalSize);
        }
    }

因此,请为我提供不同的解决方案或任何替代方案。

哪个对 Windows 8 开发的 winrt 有用?

在 Windows 8 中使用 C# 的 WinRT 中的磁盘空间

以下是 Kraig 所说的 C# 版本,其中包含一些代码,用于将其转换为字符串以获得良好的度量:

using System;
using System.Threading.Tasks;
using Windows.Storage;
namespace WinRTXamlToolkit.IO.Extensions
{
    public static class StorageItemExtensions
    {
        public static async Task<UInt64> GetFreeSpace(this IStorageItem sf)
        {
            var properties = await sf.GetBasicPropertiesAsync();
            var filteredProperties = await properties.RetrievePropertiesAsync(new[] { "System.FreeSpace" });
            var freeSpace = filteredProperties["System.FreeSpace"];
            return (UInt64)freeSpace;
        }
        public static string GetSizeString(this ulong sizeInB, double promoteLimit = 1024, double decimalLimit = 10, string separator = " ")
        {
            if (sizeInB < promoteLimit)
                return string.Format("{0}{1}B", sizeInB, separator);
            var sizeInKB = sizeInB / 1024.0;
            if (sizeInKB < decimalLimit)
                return string.Format("{0:F1}{1}KB", sizeInKB, separator);
            if (sizeInKB < promoteLimit)
                return string.Format("{0:F0}{1}KB", sizeInKB, separator);
            var sizeInMB = sizeInKB / 1024.0;
            if (sizeInMB < decimalLimit)
                return string.Format("{0:F1}{1}MB", sizeInMB, separator);
            if (sizeInMB < promoteLimit)
                return string.Format("{0:F0}{1}MB", sizeInMB, separator);
            var sizeInGB = sizeInMB / 1024.0;
            if (sizeInGB < decimalLimit)
                return string.Format("{0:F1}{1}GB", sizeInGB, separator);
            if (sizeInGB < promoteLimit)
                return string.Format("{0:F0}{1}GB", sizeInGB, separator);
            var sizeInTB = sizeInGB / 1024.0;
            if (sizeInTB < decimalLimit)
                return string.Format("{0:F1}{1}TB", sizeInTB, separator);
            return string.Format("{0:F0}{1}TB", sizeInTB, separator);
        }
    }
}

你可以这样使用它:

var freeSpace = await ApplicationData.Current.LocalFolder.GetFreeSpace();
Debug.WriteLine(freeSpace.GetSizeString());

试试这个(它是JavaScript的,但应该很容易翻译成C#):

var freeSpaceProperty = "System.FreeSpace";
var applicationData = Windows.Storage.ApplicationData.current;
var localFolder = applicationData.localFolder;
localFolder.getBasicPropertiesAsync().then(function (basicProperties) {
    // Get extra properties
    return basicProperties.retrievePropertiesAsync([freeSpaceProperty]);
}).done(function (extraProperties) {
    var propValue = extraProperties[freeSpaceProperty];
    if (propValue !== null) {
        outputDiv.innerText = "Free Space: " + propValue;
}
}, function (error) {
    // Handle errors encountered while retrieving properties
});

您可以按照您最初要求的那样,用任何其他 StorageFolder 替换 appdata 文件夹,例如音乐库文件夹。