使用 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 中的磁碟機和資料夾
下列範例示範如何使用 DirectoryInfo 和 Directory 類別來建立、刪除和管理資料夾。 此範例會使用 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 和 WinRT 執行時間資料流之間進行轉換的方法。