之前不論在寫 WinRT 或者 Windows Phone App的時候,一定會遇到這樣的需求,那就是想要檢查在 Isolated Storage 內的某個檔案是否存在,並且根據此一結果,決定接下來要怎麼繼續處理。
當然,這樣的需求已經收錄到我自己整理的 Isolated Storage Class Library 內,當作成一個非常好用的 Helper;不過,那個時候所用的方法是:
try
{
if (使用Mutex == true)
{
StorageMutex.WaitOne();
}
var file = await folder.GetFileAsync(string.Format("{0}.txt", filename));
content = await FileIO.ReadTextAsync(file);
}
catch (Exception ex)
{
Debug.WriteLine(string.Format("Filename:{0}, {1}", filename, ex.ToString()));
}
使用 GetFileAsync 並且使用異常事件捕捉方法 Try-Catch 將這個方法呼叫予以捕捉,一旦所要讀取的檔案不存在,就會產生異常事件,可以根據這個異常事件(類別 FileNotFoundException)來判斷,是否是由檔案不存在所引起的,不過,這樣的作法太不人道了。
現在有個更好的改善方法可以使用,那就是使用 StorageFile.IsAvailable 屬性來判斷,根據 MSDN 上的說法,StorageFile.IsAvailable 是:如果檔案位於本機、已在本機快取或可供下載,則為 True。否則為 false。您說,使用這個方法是不是更加方便了呢?
另外,在 Windows 8.1,也推出了另外一個相當不錯的方法:StorageFolder.TryGetItemAsync,這個方法為,嘗試使用項目名稱來取得目前資料夾中的單一檔案或子資料夾;在以往,我們需要自己寫個擴充方法來做到
public static class StorageFolderExtensions
{
public static async Task TryGetItemAsync(this StorageFolder folder,
string name)
{
var files = await folder.GetItemsAsync().AsTask().ConfigureAwait(false);
return files.FirstOrDefault(p => p.Name == name);
}
}
現在,我們只需要簡單的使用下列方法,既可以透過 StorageFolder 物件的 TryGetItemAsync 來判斷出,在該目錄下,這個檔案或者子資料夾是否存在了。
StorageFile file = await ApplicationData.Current.LocalFolder.TryGetItemAsync("test") as StorageFile;
if (file != null)
{
}
當然,若您開發的Windows Phone 8.1 App,採用的 Universal App,也可以使用這樣的解決方案喔。