FileIO.ReadTextAsync(file)
FileIO.WriteTextAsync(file)
StreamReader和StreamWriter類
以上都是基於操作的是文本內容的文件,而如果操作圖片文件或者其他二進制文件就需要操作文件的Stream和Buffer
數據了。
操作這種二進制的文件,需要用到DataWriter類和DataReader類,前者用於寫入文件信息,各種類型的數據信息都
可以進行寫入(包括文本信息),後者用於讀取文件內容。
1. Buffer類寫入操作
文件的Buffer操作使用的是IBuffer對象,所以需使用DataWriter類寫入相關信息之後再轉化爲IBuffer對象,然後保存
到文件中。其中相關信息指先寫入信息的長度(類型可能是Int32),然後寫入具體的信息內容等等,總而言之就是這個
文件組成的各個部分,簡言之就是讀寫規則:需要先寫入什麼,後寫入什麼,與之對應的就需要先讀取什麼,後讀取
什麼,如果一味的用讀取字符串的方式讀取,那麼就讀取不到信息長度,進而就無法讀取整個文件,這也是爲什麼利
用StreamReader.ReadToEnd()無法讀取除了文本文件以外的文件的原因。
using(InMemoryRandomAccessStream memoryStream = new InMemoryRandomAccessStream()){
using(DataWriter dataWriter = new DataWriter(memoryStream))
{
//文件相關信息,根據文件規則進行寫入
dataWriter.WriteInt32(size);
dataWriter.WriteString(Content);
...
IBuffer buffer = dataWriter.DetachBuffer();
}
}
await FileIO.WriteBufferAsync(file, buffer);
2. Buffer的讀取操作
讀取操作就是獲取文件的IBuffer對象之後再使用IBuffer對象初始化一個DataReader對象,然後就可以對文件進行讀
取操作了。
IBuffer buffer = await FileIO.ReadBufferAsync(file);using(DataReader dataReader = DataReader.FromBuffer(buffer))
{
//讀取文件相關信息,讀取的規則和文件的規則一致
Int32 stringSize = dataReader.ReadInt32();
string fileContent = dataReader.ReadString((uint)stringSize);
...
}
3. Stream的寫入操作
文件的Stream其實就是文件內容的信息,所以在用Stream來寫入文件的數據的時候,直接保存Stream的信息即可,
不需要再調用文件的對象進行保存。
using(StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync()){
using(DataWriter dataWriter = new DataWriter(transaction.Stream))
{
//文件的相關信息,根據文件的規則寫入
dataWriter.WriteInt32(size);
dataWriter.WriteString(content);
...
transaction.Stream.Size = await dataWriter.StoreAsync();
//保存Stream數據
await transaction.CommitAsync();
}
}
4. Stream的讀取操作
使用Stream讀取文件的內容,需要先調用DataReader類的LoadAsync()方法,將數據加載進來,在調用相關的Read
方法讀取文件的內容。而可以注意到之前Buffer讀取操作沒有調用DataReader的LoadAsync()方法,這是因爲它已經
一次性的將數據讀取出來了(DataReader.FromBuffer(buffer))。
using(IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read)){
using(DataReader dataReader = new DataReader(readStream))
{
//讀取文件相關信息,根據文件規則讀取
await dataReader.LoadAsync(sizeof(Int32));
Int32 stringSize = dataReader.ReadInt32();
await dataReader.LoadAsync((UInt32)stringSize);
string content = dataReader.ReadString((uint)stringSize);
...
}
}