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);
...
}
}