WP8開發系列3:WP7與WP8在檔案IO操作上的區別

l_serein發表於2013-03-25

一、Windows Phone 7的檔案操作:

如果在現有的wp7開發平臺上去寫入一個檔案,我們會想到使用: IsolatedStorageFile

程式碼如下:

private void WriteFile(string fileName, string content)
{
    using (IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream isolatedStorageFileStream = isolatedStorageFile.CreateFile(fileName))
        {
            using (StreamWriter streamWriter = new StreamWriter(isolatedStorageFileStream))
            {
                streamWriter.Write(content);
            }
        }
    }
}

讀取一個檔案:

private string ReadFile(string fileName)
{
    string text;
    using (IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream isolatedStorageFileStream = isolatedStorageFile.OpenFile(fileName, FileMode.Open))
        {
            using (StreamReader streamReader = new StreamReader(isolatedStorageFileStream))
            {
                text = streamReader.ReadToEnd();
            }
        }
    }
    return text;
}

然後,可以用IsoStoreSpy這類輔助工具進應用程式檢視儲存的檔案的內容等操作.

二、Windows Phone 8 檔案操作

wp8與win8的檔案操作方式類似,如果你在win8下寫過檔案操作,那麼WP8自然熟悉,這需要用到2個介面:IStorageFile和 IStorageFolder, 可以看出,一個是對檔案的操作,一個是對目錄的。這兩個介面均在 :Windwos.Storage元件中,

注意:因在windows 8 開發中大量使用了WinRT非同步程式設計方式,故在WP8中程式設計亦如此。

寫入檔案:

public async Task WriteFile(string fileName, string text)
{
    IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder;
 
    IStorageFile storageFile = await applicationFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
 
    using (Stream stream = await storageFile.OpenStreamForWriteAsync())
    {
        byte[] content = Encoding.UTF8.GetBytes(text);
        await stream.WriteAsync(content, 0, content.Length);
    }
}

讀取檔案:

public async Task<string> ReadFile(string fileName)
{
    string text;
    IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder;
 
    IStorageFile storageFile = await applicationFolder.GetFileAsync(fileName);
 
    IRandomAccessStream accessStream = await storageFile.OpenReadAsync();
 
    using (Stream stream = accessStream.AsStreamForRead((int)accessStream.Size))
    {
        byte[] content = new byte[stream.Length];
        await stream.ReadAsync(content, 0, (int) stream.Length);
 
        text = Encoding.UTF8.GetString(content, 0, content.Length);
    }
    return text;
}

OK,到此我們將操作檔案的方法寫好後,就可以在業務層進行呼叫了,方式如下:

await WriteFile("TestWP8IO.txt", "測試WP8與WP7檔案操作");
string text = await ReadFile("TestWP8IO.txt")

三、相容性問題

上面的程式碼分別對WP7與WP8平臺的檔案寫入與讀取操作進行了簡單的說明,你可能會想:“我在WP7應用中的檔案目錄結構定義,是不是在WP8中也是一樣的呢?”其實,兩者是有點區別的,這點區別,也是日後WP7向WP8遷移過程中必須要考慮的元素之一。

在WP7中,建立檔案userinfo.txt,那麼,它在隔離儲存區的檔案目錄結構如下:

C:\Data\Users\DefaultAppAccount\AppData\{ProductID}\Local\IsolatedStore\userinfo.txt

在WP8中,建立相同檔案,檔案儲存目錄結構如下:

C:\Data\Users\DefaultAppAccount\AppData\{ProductID}\Local\userinfo.txt

兩者一對比,我們很直觀的就能看到區別在哪裡,這就意味著:在WP8開發中,使用現有的WP7程式碼時,如果你不想改變原有檔案目錄結構,那你就必須要首先獲取WP7隔離儲存目錄.即:

IStorageFolder applicationFolder =await ApplicationData.Current.LocalFolder.GetFolderAsync("IsolatedStore");

最後,想說明的是:

如果你想“偷懶”或者說減少開發工作量,就看看我上面說的這些,但我建議各位開發者,最好是全新開發基於WP8平臺的應用,畢竟這意味著你也可以在Win8中快速部署。

相關文章