将富文本文档保存到Windows应用商店应用中的临时文件夹

时间:2014-01-18 10:38:04

标签: c# file-io windows-store-apps

我正在尝试将RichEditBox的内容保存到我的应用临时文件夹中,但我无法让它工作。

以下是通过“保存文件”选择器将文件保存到磁盘的工作代码:

// [code for savePicker. Not relevant because that all works fine]
StorageFile file = await savePicker.PickSaveFileAsync();
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite);
editor.Document.SaveToStream(TextGetOptions.FormatRtf, stream);

以下是将txt文件保存到临时存储空间的工作代码

StorageFolder temp = ApplicationData.Current.TemporaryFolder;
StorageFile file = await temp.CreateFileAsync("temp.txt", 
                         CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, "some text");

所以当我将这些内容组合起来将RTF内容保存到临时文件夹时,这就是我写的:

StorageFolder temp = ApplicationData.Current.TemporaryFolder;
StorageFile file = await temp.CreateFileAsync("temp.rtf", 
                         CreationCollisionOption.ReplaceExisting);
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite);
editor.Document.SaveToStream(TextGetOptions.FormatRtf, stream);

这不起作用。我在第二行(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))上收到了拒绝访问错误StorageFile file = etc。但是,同一行代码在上面的第二个块中执行正常。似乎当我用file.OpenAsync跟随它时,它会抛出一个错误。有人能指出我在正确的方向吗?是否与await有关?

编辑:我已接受并赞成Damir Arh的答案,因为这是对这个问题的正确解决方法。我的解决方法为我解决了这个问题,但Damir Arh的答案解决了问题的根本原因,当然这个问题总是更好。

2 个答案:

答案 0 :(得分:4)

这段代码应该可以正常工作;我甚至测试了它,只是为了确定:

StorageFolder temp = ApplicationData.Current.TemporaryFolder;
StorageFile file = await temp.CreateFileAsync("temp.rtf", 
                         CreationCollisionOption.ReplaceExisting);
IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite);
editor.Document.SaveToStream(TextGetOptions.FormatRtf, stream);

您错误地识别了它失败的原因。 CreateFileAsync不能失败,因为它后跟OpenAsync;后者在失败时甚至没有开始执行。

最可能的原因是你已经从Stream打开了你没有正确关闭它。即使使用您在答案中发布的代码,这仍然会发生。

我建议您使用CreationCollisionOption.GenerateUniqueName代替CreationCollisionOption.ReplaceExisting。这样,如果由于某种原因它不能与原始文件名一起使用,将创建具有不同名称的文件。

一旦完成写作,还要确保正确关闭流。由于IRandomAccessStream实现了IDisposable,因此当您不再需要Dispose时,应始终在其上调用using。或者甚至更好:把它放在StorageFolder temp = ApplicationData.Current.TemporaryFolder; StorageFile file = await temp.CreateFileAsync("temp.rtf", CreationCollisionOption.GenerateUniqueName); using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite)) { Editor.Document.SaveToStream(TextGetOptions.FormatRtf, stream); await stream.FlushAsync(); } 块中,它会为你做这件事。

以下是应用了这两个更改的代码:

{{1}}

答案 1 :(得分:0)

我找到了一个解决方法:

StorageFolder temp = ApplicationData.Current.TemporaryFolder;
StorageFile file = await temp.CreateFileAsync("temp.rtf", 
                         CreationCollisionOption.ReplaceExisting);
string rtfcontent = "";
editor.Document.GetText(TextGetOptions.FormatRtf, out rtfcontent);
await FileIO.WriteTextAsync(file, rtfcontent);