【问题标题】:Using StorageFile class having the file content in UWP [Universal Windows Platform]在 UWP [通用 Windows 平台] 中使用具有文件内容的 StorageFile 类
【发布时间】:2017-07-02 17:50:54
【问题描述】:

我有一个 API 服务,它使用带有 POST 方法的标准 HttpClient 转换文件并发送回转换后的 PDF 文件,实际上它是内容。我不需要磁盘上文件的物理副本,但它相当于 StorageFile 类。

我有一些关于这个主题的问题在任何地方都找不到答案:

  1. 当我使用StorageFile 类获取文件内容时如何创建文件?还是我需要使用另一个类来最初创建一个文件(例如文件)?在 UWP 中是否推荐?

  2. 有没有办法在不创建文件物理副本的情况下使用StorageFile 类?

  3. 哪个选项更好 - 首先将文件保存在临时文件夹中然后使用它或直接创建StorageFile 类?为什么?

【问题讨论】:

    标签: c# .net file io uwp


    【解决方案1】:

    当我使用 StorageFile 类获取文件内容时如何创建文件?还是我需要使用另一个类来最初创建一个文件(例如文件)?在 UWP 中是否推荐?

    接收的内容通常是字符串格式。您可能需要在某个地方创建一个新的空白文件,通常是当前应用程序的本地文件夹。然后,将内容写入刚刚创建的文件。这是一个非常示例的演示:

    string content = "postcontent";
    StorageFolder localfolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    Windows.Storage.StorageFile sampleFile = await localfolder.CreateFileAsync("sample.pdf", Windows.Storage.CreationCollisionOption.ReplaceExisting);
    await Windows.Storage.FileIO.WriteTextAsync(sampleFile, content);
    

    有关如何使用StorageFile 创建和写入文件的详细信息,请参考this article。请注意,这只是一个简单的创建和写入文件示例,对于真正的 pdf 文件,这需要将复杂格式的内容写入文件。

    StorageFile类用于uwp中的文件操作,我们使用该类创建和写入文件,其他类可能不需要。 File 属于 System.IO 命名空间的类也应该在 uwp 中使用,但建议使用 StorageFile

    有没有办法在不创建文件物理副本的情况下使用 StorageFile 类

    恐怕不会。正如我上面所说的StorageFile是用于访问文件对象,如果没有文件如何访问?您收到的内容不应是文件对象,它们可能是文本或文件流。

    哪个选项更好 - 首先将文件保存在临时文件夹中,然后使用它或直接创建 StorageFile 类?为什么?

    创建一个临时文件,您将拥有一个StorageFile 实例,然后您应该能够通过StorageFile 对象写入接收到的文件流内容。似乎在本地文件夹中创建一个临时文件是更好的方法,因为 StorageFile 可能不是由 http 内容创建的。

    另外,UWP中的文件访问有特殊权限我们可能需要注意,具体可以参考File access permissions

    【讨论】:

      【解决方案2】:

      您可以使用the StorageFile.CreateStreamedFileAsync method 创建虚拟StorageFile。你给它一个名字、一个委托和一个可选的缩略图。当有人试图访问虚拟StorageFile 的内容时,您的委托将被调用,它的工作是用数据填充提供的输出流。

      草图:

      private async Task<StorageFile> ConvertFileAsync(StorageFile originalFile)
      {
          var resultBuffer = await PostFileToServiceAndGetResultAsync(originalFile);
      
          return
              await StorageFile.CreateStreamedFileAsync("result.pdf",
                  async (request) => {
                      using (request)
                      {
                          await request.WriteAsync(resultBuffer);
                      }
                  }, null);
      }
      

      另一个例子可以在on MSDN找到。

      【讨论】:

        【解决方案3】:

        将它保存到临时存储可能是最简单的,但您也可以自己实现 IStorageFile 并将下载的 pdf 作为新类中的变量保存在内存中。

        【讨论】:

          猜你喜欢
          • 2017-02-01
          • 2016-04-25
          • 1970-01-01
          • 2016-07-29
          • 1970-01-01
          • 2017-03-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-09
          相关资源
          最近更新 更多