【问题标题】:FileSavePicker: Saving to memory?FileSavePicker:保存到内存?
【发布时间】:2012-07-26 08:17:12
【问题描述】:

我有一个管理文档的 WinRT Metro 应用程序(XAML/C#,Windows Release Preview)。文档在内存中表示并通过 Web 服务获取,但并未物理存储在磁盘上。

为了改进我的应用程序,我想实现 FileSavePicker 合同。因此,其他应用程序可以将他们的文档直接保存到我的应用程序中。但似乎无法将内存中的文件保存选择器中的内容获取到我的应用程序中。我已将一个事件处理程序附加到当用户想要将文件保存到我的应用程序时触发的 FileSavePickerActivatedEventArgs.FileSavePickerUI.TargetFileRequested 事件。但是在这里我必须将TargetFileRequestedEventArgs.Request.TargetFile 设置为StorageFile,因为我在内存中并且还没有文件,所以这个操作失败了。

此外(即使我有一个 StorageFile)我必须对文件保存过程的完成做出反应,而且似乎没有我可以采取的方法/事件来处理这个问题。

我不明白为什么微软决定为文件保存选择器合约采用这种 API 方式。为什么我不能将保存的数据/文件作为参数/流并做我想做的事?在这种情况下,沙盒/安全性不是原因!

编辑:我已经看到并查看了 SDK 中的文件选择器合同示例应用程序,但它没有帮助,因为它只保存到物理 StorageFile。

【问题讨论】:

    标签: c# windows-8 microsoft-metro windows-runtime


    【解决方案1】:

    你看过CachedFileUpdater contract吗?当源应用程序写入文件时,您可以使用它来接收通知。您仍然需要为此创建一个 StorageFile。

    【讨论】:

    • 好的,那么也许一种解决方法是在本地文件夹中创建一个临时文件并观察对它的更改...然后读取内容并将其删除。如果这是我唯一的选择,我会照顾它。
    【解决方案2】:

    您需要使用StorageFile.CreateStreamedFileAsync。此方法将在向您请求数据时向您返回一个由您即时构建的 StorageFile。当从“文件”请求数据时,将调用您传入第二个参数的委托。发生这种情况时,您可以从任何您想要的流中抽取数据。

    【讨论】:

    • 这个方法我知道,但是好像不太合适。不是我想将数据推送到流/StorageFile 中,而是文件保存选择器在我设置TargetFileRequestedEventArgs.Request.TargetFile 时执行此操作。所以StorageFile.CreateStreamedFileAsync 在我的情况下似乎不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多