我正在尝试将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
有关?
答案 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);