首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 8 Store Apps 開發實戰 (23):檔案系統核心 — 文字、二進位、串流讀寫與快取存取清單

     編輯:關於.NET

前言:Storage API 的三種讀寫範式

Windows.Storage 命名空間提供 FileIO 高階助手、IBuffer 二進位操作、DataReader/Writer 串流操作 三種層次的 API。搭配 StorageApplicationPermissions 的「最近使用清單」 (MRU) 與「未來存取清單」 (FAL),可跨工作階段保持檔案存取權限。本篇逐一實戰演示。

1. 文字讀寫 — FileIO 高階 API

// 寫入(指定 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。

2. 二進位讀寫 — IBuffer 與 FileIO

// 字串轉 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。

3. 串流讀寫 — DataReader/Writer 與交易式寫入

// 交易式寫入:原子性保證
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 需指定載入長度。

4. 快取存取清單 — 跨 Session 保持權限

清單用途容量限制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);
}

實務撇步

  1. 檔案類型關聯:讀寫特定副檔名必須在 Manifest 宣告,否則 GetFileAsync 會擲出存取拒絕。
  2. MRU 自動維護:系統依使用時間自動排序並移除舊項,適合「最近開啟」選單。
  3. FAL 需手動管理:加入後不自動移除,App 應在不再需要時呼叫 Remove(token)。
  4. Metadata 參數:Add(file, metadata) 的第二個參數可存放自訂內容(如縮圖路徑、標籤),隨 Token 一併儲存。
  5. 完整程式碼下載

    原始碼完整包(含所有範例專案)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved