Windows 8 `ApplicationData.TemporaryFolder` 提供應用專屬的暫存儲存區,**不參與漫遊同步**、**系統可隨時清理 (磁碟空間不足、使用者執行磁碟清理)**、**應用解除安裝時自動刪除**。適合存放:會話快取、臨時下載檔案、影像處理中間結果、離線草稿 (需配合定期存檔邏輯)。
using Windows.Storage;
using Windows.Globalization.DateTimeFormatting;
private async void WriteTimestamp() {
var tempFolder = ApplicationData.Current.TemporaryFolder;
// 建立/取代檔案
StorageFile file = await tempFolder.CreateFileAsync(
"session_draft.txt",
CreationCollisionOption.ReplaceExisting);
// 寫入文字 (支援 Unicode)
var formatter = new DateTimeFormatter("longtime");
string content = $"草稿儲存時間: {formatter.Format(DateTime.Now)}";
await FileIO.WriteTextAsync(file, content);
// 或寫入二進位資料
// byte[] buffer = ...; await FileIO.WriteBytesAsync(file, buffer);
}
private async void ReadTimestamp() {
var tempFolder = ApplicationData.Current.TemporaryFolder;
try {
StorageFile file = await tempFolder.GetFileAsync("session_draft.txt");
string content = await FileIO.ReadTextAsync(file);
// 還原草稿內容至 UI
DraftTextBox.Text = content;
} catch (FileNotFoundException) {
// 檔案不存在 (可能被系統清理、首次執行)
// 初始化空白草稿
} catch (Exception ex) {
// 其他錯誤 (權限、磁碟損壞)
}
}
// 列舉所有檔案
IReadOnlyList files = await tempFolder.GetFilesAsync();
foreach (var f in files) { /* 處理 */ }
// 刪除特定檔案
await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
// 一次清空整個暫存資料夾 (謹慎使用)
IReadOnlyList allFiles = await tempFolder.GetFilesAsync();
foreach (var f in allFiles) await f.DeleteAsync();
IReadOnlyList subFolders = await tempFolder.GetFoldersAsync();
foreach (var f in subFolders) await f.DeleteAsync();
// 應用啟動/頁面載入時嘗試讀取
protected override async void OnNavigatedTo(NavigationEventArgs e) {
await LoadDraftAsync(); // 從 TemporaryFolder 還原
}
// 使用者編輯時定期自動存檔 (防止意外關閉/掛起遺失)
private async void OnTextChanged(object sender, TextChangedEventArgs e) {
if (_autoSaveTimer == null) _autoSaveTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(30) };
_autoSaveTimer.Tick += async (s, _) => await SaveDraftAsync();
_autoSaveTimer.Start();
}
// 掛起時強制存檔 (雖然 TemporaryFolder 可能被清理,但掛起期間通常安全)
private async void OnSuspending(object sender, SuspendingEventArgs e) {
var deferral = e.SuspendingOperation.GetDeferral();
await SaveDraftAsync(); // 同步寫入 TemporaryFolder
deferral.Complete();
}
// 步驟 1: 下載/產生原始檔 → TemporaryFolder
StorageFile rawFile = await tempFolder.CreateFileAsync("raw_input.dat");
await DownloadToFileAsync(url, rawFile);
// 步驟 2: 讀取 → 處理 (解碼/濾鏡/轉碼) → 寫入中間檔 (同 TemporaryFolder)
StorageFile intermediateFile = await tempFolder.CreateFileAsync("intermediate.jpg");
await ProcessImageAsync(rawFile, intermediateFile);
// 步驟 3: 最终結果 → 移動至 LocalFolder 永久保存 / 上傳雲端 / 分享
StorageFile finalFile = await intermediateFile.MoveAsync(
ApplicationData.Current.LocalFolder,
"final_result.jpg",
NameCollisionOption.ReplaceExisting);
// 步驟 4: 清理暫存檔 (釋放空間)
await rawFile.DeleteAsync();
await intermediateFile.DeleteAsync();
// 核心邏輯:暫存資料夾 = 高頻寫入/讀取 (效能最佳,SSD 友善)
// 本地資料夾 = 低頻備份/持久化 (生存保障)
private async Task SaveDraftAsync(string content) {
// 1. 立即寫入 TemporaryFolder (快速、非阻塞)
await WriteToTempAsync("draft.txt", content);
// 2. 背景低優先度備份至 LocalFolder (防止系統清理)
_ = Task.Run(async () => {
await Task.Delay(TimeSpan.FromMinutes(5)); // 延後批次備份
await WriteToLocalAsync("draft_backup.txt", content);
});
}
private async Task LoadDraftAsync() {
// 優先嘗試 TemporaryFolder (最新)
string content = await ReadFromTempAsync("draft.txt");
if (string.IsNullOrEmpty(content)) {
// 回退讀取 LocalFolder 備份
content = await ReadFromLocalAsync("draft_backup.txt");
}
// 還原 UI
}
| 特性 | TemporaryFolder | LocalFolder | RoamingFolder |
|---|---|---|---|
| 持久性 | 低 (系統隨時清理) | 高 (僅應用解除安裝刪除) | 高 (雲端漫遊,裝置間同步) |
| 漫遊同步 | 否 | 否 | 是 (≤ 100KB/應用) |
| 效能 (SSD) | 最佳 (系統優化暫存 I/O) | 標準 | 標準 (+雲端同步延遲) |
| 適用場景 | 快取、中間檔、會話草稿 | 使用者文件、設定、資料庫、永久資產 | 偏好設定、遊戲進度、小型跨裝置資料 |
| 配額 | 動態 (系統管理) | 靜態 (磁碟配額) | 嚴格 100KB |
`TemporaryFolder` 是高效能、免管理配額、自動清理的**暫存專用區**。核心心法:**「寫得快、讀得快、丟得快、不心疼」**。將會話草稿、中間運算檔案、可重新產生的快取資料放入此處,配合 `LocalFolder` 關鍵節點備份策略,即能兼顧效能與資料安全,讓應用在資源受限環境下依然輕快穩定。