寫入和讀取

2018-08-12 21:55 更新

寫入和讀取

準(zhǔn)備工作

在 XAML 中添加一個(gè) TextBlock 用于顯示相關(guān)信息,添加一個(gè) Button 來(lái)使用它的 Click 事件,當(dāng)然了,最后分別創(chuàng)建 2 個(gè)。

創(chuàng)建文件和讀取文件

實(shí)例化 StorageFolder 類

我們的文件不可能讓其隨意保存在計(jì)算機(jī)/手機(jī)中的任何一個(gè)地方,應(yīng)該先確定它的文件夾,對(duì)吧?

在新的 Windows 8 中,微軟開啟了 Windows 上的 App 時(shí)代,下載的軟件再也不能隨意安裝到任何地方了,而是由操作系統(tǒng)統(tǒng)一放到一塊叫做“獨(dú)立存儲(chǔ)”的地方。這也是出于安全的考慮。用過 Windows Phone 8 的朋友應(yīng)該更加清楚了。

那么下面這行代碼的 LocalFolder 究竟在哪里呢?

StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;

下圖中的文件,就是我當(dāng)前所寫的 App。(補(bǔ)充一條哦,一開始我裝了 Win8 后,下載了一個(gè)游戲,模擬類的,有金幣呀什么的,后來(lái)我找到這個(gè) App 的文件,將數(shù)據(jù)改了之后金幣就嘩嘩的啦。當(dāng)然了,對(duì)于其他單機(jī)而言這個(gè)完全不值一提,但 App 的數(shù)據(jù),相信還有很多人沒有改過吧。)

那么這張圖中的紅方框的文件夾就是 LocalFolder 啦,下面還有一個(gè)存儲(chǔ)漫游文件的文件夾。

不論是讀取文件還是寫入文件,都得先確定一個(gè)文件夾哦。

實(shí)例化 StorageFile

確定了文件夾,就得確定文件咯。對(duì)于創(chuàng)建文件而言,執(zhí)行以下代碼。既然用到了異步,在函數(shù)上加上 async 是必不可少的咯,這一點(diǎn)我們?cè)谇懊嬷v到過。后面的 ReplaceExisting 屬性是指的,如果該文件(名)已經(jīng)存在了,則替換它。

 StorageFile file =
            await folder.CreateFileAsync("New Document.txt", CreationCollisionOption.ReplaceExisting);

那么對(duì)于讀取文件呢,就直接讀取好啦。

 StorageFile file = await folder.GetFileAsync("sample.txt");

創(chuàng)建和讀取文件

將文本寫入文件按照如下代碼,將文件名和文本內(nèi)容(字符串)。

await FileIO.WriteTextAsync(file, "Write text to file.");

讀取文件也是類似的。

string text = await FileIO.ReadTextAsync(file);

我們還可以將這個(gè)讀取的字符串傳遞給前面定義的 TextBlock 來(lái)加以調(diào)試。以下是完整的代碼。

 // 創(chuàng)建文件
StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile file = await folder.CreateFileAsync("New Document.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, "Write text to file.");
// 2  從文本讀取文件
StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
StorageFile file = await folder.GetFileAsync("sample.txt");
string text = await Windows.Storage.FileIO.ReadTextAsync(file);
tBlockReadInfo.Text = text;

使用緩沖區(qū)將字節(jié)寫入到文件或從文件讀取字節(jié)

1.實(shí)例化 StorageFolder 類 同上。

2.實(shí)例化 StorageFile 同上。

3.將字節(jié)寫入到文件

a.建立緩沖區(qū)

var buffer = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBina  
("There's buffer ...... ", Windows.Security.Cryptography.BinaryStringEncoding.Utf8);

b.將緩沖區(qū)中的字節(jié)寫入到文件

await Windows.Storage.FileIO.WriteBufferAsync(file, buffer);

4.從文件讀取字節(jié)

a.將文件加載到緩沖區(qū)

var buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);

b.實(shí)例化 DataReader,讀取緩沖區(qū)

DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer(buffer);

c.從 DataReader 對(duì)象中讀取字符串

string text = dataReader.ReadString(buffer.Length);

使用流將文本寫入文件或從文件讀取文本

1.實(shí)例化 StorageFolder 類 同上。

2.實(shí)例化 StorageFile 同上。

3.新建流,并異步地將 file 打開,使用可讀寫的方式

var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

4.將文本寫入到文件

a.使用 using

using (var writeStream= stream.GetOutputStreamAt(0))
{
    ......
}

b.(在 using 語(yǔ)句的花括號(hào)內(nèi))創(chuàng)建 DataWriter 對(duì)象,并調(diào)用 DataWriter.WriteString 方法,將文本寫入到 writeStream 中

DataWriter dataWriter = new DataWriter(writeStream);
dataWriter.WriteString("Stream is a good thing.");

c.將文本保存到文件中,并通過 StoreAsync 和 FlushAsync 方法存儲(chǔ)和關(guān)閉流

await dataWriter.StoreAsync();
await writeStream.FlushAsync();

5.從文件讀取文本

a.獲取該流的 size

var size = stream.Size;

b.使用 using

using (var readStream = stream.GetOutputStreamAt(0))
{
    ......
}

c.(在 using 語(yǔ)句的花括號(hào)內(nèi))創(chuàng)建 DataWriter 對(duì)象,并調(diào)用 LoadAsync 方法,最后調(diào)用 ReadString 即可。最后還可以將信息輸出到 TextBlock 中。

DataReader dataReader = new DataReader(readStream);
uint uintBytes = await dataReader.LoadAsync((uint)size);
string text = dataReader.ReadString(uintBytes);
tBlockReadInfo.Text = text;
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)