下面开始读取文件。为了把 Windows Runtime 流转换为 .NET 流用于读取,可以使用扩展方法 AsStreamForRead。这个方法是在程序集 SystemRuntime.WindowsRuntime 的 System.IO 名称空间中定义(必须打,这个方法创建了一个新的 Stream 对象,来管理 IInputStream。现在,可以使用它作为正常的 .NET 流,如前所述,例如,给它传递一个 StreamReader,使用这个读取器访问文件:.
public async void OnOpenDotnet()
{
try
{
var picker = new FileOpenPicker()
{
ViewMode = PickerViewMode.Thumbnail,
SuggestedStartLocation = PickerLocationId.DocumentsLibrary
};
picker.FileTypeFilter.Add(".txt");
picker.FileTypeFilter.Add(".md");
StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
IRandomAccessStreamWithContentType wrtStream = await file.OpenReadAsync();
Stream stream = wrtStream.AsStreamForRead();
using (var reader = new StreamReader(stream))
{
text1.Text = await reader.ReadToEndAsync();
}
}
}
catch (Exception ex)
{
var dlg = new MessageDialog(ex.Message, "Error");
await dlg.ShowAsync();
}
}
所有的 Windows Runtime 流类型都很容易转换为 .NET 流,反之亦然。表 1 列出了所需的方法:
现在将更改保存到文件中。用于写入的流通过扩展方法 AsStreamForWrite 转换。现在,这个流可以使用 StreamWriter 类写入。代码片段也把 UFT-8 编码的序言写入文件:
public async void OnSaveDotnet()
{
try
{
var picker = new FileSavePicker()
{
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
SuggestedFileName = "New Document"
};
picker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt"});
StorageFile file = await picker.PickSaveFileAsync();
if (file != null)
{
StorageStreamTransaction tx = await file.OpenTransactedWriteAsync();
using (var writer = new StreamWriter(tx.Stream.AsStreamForWrite()))
{
byte[] preamble = Encoding.UTF8.GetPreamble();
await stream.WriteAsync(preamble, 0,preamble.Length);
await writer.WriteAsync(text1.Text);
await writer.FlushAsync();
tx.Stream.Size = (ulong)stream.Length;
await tx.CommitAsync();
}
}
}
catch (Exception ex)
{
var dlg = new MessageDialog(ex.Message, "Error");
await dlg.ShowAsync();
}
}