Windows.Storage 命名空間提供 FileIO 高階助手、IBuffer 二進位操作、DataReader/Writer 串流操作 三種層次的 API。搭配 StorageApplicationPermissions 的「最近使用清單」 (MRU) 與「未來存取清單」 (FAL),可跨工作階段保持檔案存取權限。本篇逐一實戰演示。
// 寫入(指定 UTF-8)
StorageFile file = await KnownFolders.DocumentsLibrary.CreateFileAsync(
"webabcdText.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, "I am webabcd", UnicodeEncoding.Utf8);
// 讀取
StorageFile file = await KnownFolders.DocumentsLibrary.GetFileAsync("webabcdText.txt");
string text = await FileIO.ReadTextAsync(file, UnicodeEncoding.Utf8);
關鍵方法:WriteTextAsync、AppendTextAsync、WriteLinesAsync、ReadTextAsync、ReadLinesAsync。
// 字串轉 Buffer 寫入
string text = "I am webabcd";
IBuffer buffer = ConverterHelper.String2Buffer(text); // 自訂輔助類別
await FileIO.WriteBufferAsync(file, buffer);
// 讀取 Buffer 轉字串
IBuffer buffer = await FileIO.ReadBufferAsync(file);
string text = ConverterHelper.Buffer2String(buffer);
IBuffer 是 WinRT 的位元組陣列抽象,配合 CryptographicBuffer 或自訂轉換器互轉 byte[]/string。
// 交易式寫入:原子性保證
using (var transaction = await file.OpenTransactedWriteAsync())
{
using (var writer = new DataWriter(transaction.Stream))
{
writer.WriteString("I am webabcd");
transaction.Stream.Size = await writer.StoreAsync();
await transaction.CommitAsync(); // 真正落盤
}
}
// 讀取串流
using (var stream = await file.OpenAsync(FileAccessMode.Read))
using (var reader = new DataReader(stream))
{
uint size = (uint)stream.Size;
uint loaded = await reader.LoadAsync(size);
string content = reader.ReadString(loaded);
}
重點:OpenTransactedWriteAsync 回傳 StorageStreamTransaction,必須呼叫 CommitAsync 才會認可變更;DataReader.LoadAsync 需指定載入長度。
| 清單 | 用途 | 容量限制 | Token 機制 |
|---|---|---|---|
| MostRecentlyUsedList (MRU) | 最近使用的檔案/資料夾 | 25 項(系統自動淘汰舊項) | Add 回傳 token,GetFileAsync(token) 取回 |
| FutureAccessList (FAL) | App 預期未來需存取的項目 | 1000 項 | 同 MRU,適合「另存新檔」後保留權限 |
// 加入 MRU
StorageFile file = await KnownFolders.DocumentsLibrary.GetFileAsync("webabcdCacheAccess.txt");
string token = StorageApplicationPermissions.MostRecentlyUsedList.Add(file, file.Name);
// 加入 FAL
string token2 = StorageApplicationPermissions.FutureAccessList.Add(file, file.Name);
// 透過 Token 取回(跨啟動有效)
var entries = StorageApplicationPermissions.MostRecentlyUsedList.Entries;
if (entries.Count > 0)
{
StorageFile file = await StorageApplicationPermissions.MostRecentlyUsedList.GetFileAsync(entries[0].Token);
string text = await FileIO.ReadTextAsync(file);
}
GetFileAsync 會擲出存取拒絕。Remove(token)。Add(file, metadata) 的第二個參數可存放自訂內容(如縮圖路徑、標籤),隨 Token 一併儲存。