C# 把Windows Runtime 类型映射为.NET 类型

下面开始读取文件。为了把 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 列出了所需的方法:

C# 把Windows Runtime 类型映射为.NET 类型

现在将更改保存到文件中。用于写入的流通过扩展方法 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();
  }
}