使用 Windows 应用 SDK 和 .NET 访问文件和文件夹

打包的 Windows 应用 SDK 应用可以利用 .NET API 读取和写入文件、处理文件夹以及读取驱动器和卷信息。 此外,任何打包的桌面应用都可以利用 Windows SDK 中的 WinRT 和 Win32 API,以及 .NET SDK 中提供的 API。 本文提供的指导介绍的是如何使用 .NET System.IO API 读取和写入文件、管理驱动器和文件夹以及使用内存流对字符串数据进行编码或解码。

使用 .NET API 读取和写入文件

在以下示例中,ReadWriteFiles 创建一个新文件、将一组整数写入文件,然后再从文件中读取这些整数。 该示例使用 FileStream 类创建新文件并打开文件以进行读取或写入。 该示例使用 BinaryWriter 类将整数写入文件,并使用 BinaryReader 类从文件中读取整数。

using System.IO;
...
ReadWriteFiles("test.bin");
...
private void ReadWriteFiles(string fileName)
{
    if (File.Exists(fileName))
    {
        Console.WriteLine($"{fileName} already exists!");
        return;
    }

    using (FileStream fs = new(fileName, FileMode.CreateNew))
    {
        using BinaryWriter writer = new(fs);
        for (int i = 0; i < 11; i++)
        {
            writer.Write(i);
        }
    }

    using (FileStream fs = new(fileName, FileMode.Open, FileAccess.Read))
    {
        using BinaryReader reader = new(fs);
        for (int i = 0; i < 11; i++)
        {
            Console.WriteLine(reader.ReadInt32());
        }
    }
}

在 .NET 中管理驱动器和文件夹

以下示例演示如何使用 DirectoryInfoDirectory 类创建、删除和管理文件夹。 该示例使用 DirectoryInfo 类创建新目录、创建子目录和删除该目录。 DirectoryInfo 类提供用于创建、移动和枚举目录和子目录的方法。 Directory 类提供用于创建、移动和枚举目录和子目录的静态方法。

using System.IO;
...
private void FolderTest()
{
    FolderManagement(@"c:\MyDir", "Projects");
}
private void FolderManagement(string path, string subfolderName)
{
    DirectoryInfo di = new(path);
    try
    {
        // Create directory if it doesn't exist
        if (di.Exists)
        {
            Console.WriteLine("Path already exists.");
        }
        else
        {
            di.Create();
            Console.WriteLine("The directory was created successfully.");
        }

        // Create subdirectory if it doesn't exist
        string subfolderPath = Path.Combine(path, subfolderName);
        if (Directory.Exists(subfolderPath))
        {
            Console.WriteLine("Subfolder path already exists.");
        }
        else
        {
            di.CreateSubdirectory(subfolderName);
            Console.WriteLine("The subdirectory was created successfully.");
        }

        // Delete directory
        di.Delete(true);
        Console.WriteLine("The directory was deleted successfully.");
    }
    catch (Exception ex)
    {
        Console.WriteLine("The process failed: {0}", ex.ToString());
    }
}

此示例使用静态 GetDrives 方法检索有关系统上所有驱动器的信息。 DriveInfo 类提供有关驱动器的信息,例如驱动器类型、标签、文件系统和可用空间。

using System.IO;
...
private void DriveManagement()
{
    DriveInfo[] drives = DriveInfo.GetDrives();

    foreach (DriveInfo d in drives)
    {
        Console.WriteLine($"Drive name: {d.Name}");
        Console.WriteLine($"  Drive type: {d.DriveType}");
        if (d.IsReady)
        {
            Console.WriteLine($"  Volume label: {d.VolumeLabel}");
            Console.WriteLine($"  File system type: {d.DriveFormat}");
            Console.WriteLine($"  Space available to user: {d.AvailableFreeSpace, 15} bytes");
            Console.WriteLine($"  Total available space: {d.TotalFreeSpace, 15} bytes");
            Console.WriteLine($"  Total size of drive: {d.TotalSize, 15} bytes ");
        }
    }
}

使用 MemoryStream 对字符串进行编码和解码

此示例演示如何使用 MemoryStream 类对字符串数据进行编码和解码。 它首先创建 MemoryStream,以异步方式将字符串写入内存流,然后从内存流中读取字符串。 Encoding 类用于将字符串转换为字节数组,然后将字节数组写入内存流。 然后使用 StreamReader 从内存流中异步读取字节数组,然后通过调用 ReadToEndAsync 将字节数组转换回字符串。

using System.IO;
using System.Text;
...
private async Task EncodeDecodeStringAsync(string inputData)
{
    using MemoryStream stream = new();
    var inputBytes = Encoding.UTF8.GetBytes(inputData);
    await stream.WriteAsync(inputBytes, 0, inputBytes.Length);
    stream.Seek(0, SeekOrigin.Begin);

    using StreamReader reader = new(stream);
    string text = await reader.ReadToEndAsync();
    Console.WriteLine(text);
}

注意

有关在 .NET 流和 WinRT 流之间进行转换的信息,请参阅如何:在 .NET 流和 Windows 运行时流之间进行转换

另请参阅

使用 Windows 应用 SDK 和 WinRT API 访问文件和文件夹

Windows 应用 SDK 文件、文件夹和库