我有一个保存文件的通用Windows平台应用程序。在大多数情况下,它完美地运作。但是,每当我尝试将文件保存到Dropbox观看的文件夹中时,我都会遇到此异常:
Platform :: AccessDeniedException ^在内存位置0x045FD0D0。 HRESULT:0x80070005访问被拒绝。 WinRT信息:访问被拒绝。
这是由我的代码中的这一行引起的,在我保存文件之前调用:
CachedFileManager::DeferUpdates(file);
此调用的documentation中没有任何内容告诉我问题是什么,或者确实甚至可以抛出此异常,尽管当然在大多数API中都没有充分记录异常。
OneDrive观看的文件夹中不会出现此问题。
该文件是否已同步到Dropbox似乎无关紧要。如果文件是新的,则将创建一个新文件,然后抛出此异常。如果文件存在,则在更新之前将抛出此异常。
为什么会发生这种情况,我该如何妥善解决?
现在,我只是简单地将该行包含在try catch块中,然后放弃AccessDeniedException
。
更新:我刚刚切换到Windows Insider预览。我在构建14295上,这个问题略有变异。这是新的例外:
Platform :: COMException ^在内存位置0x00000043892FB9F0。 HRESULT:0x8000FFFF灾难性的失败
仍然不知道为什么会发生这种情况,但类似的黑客攻击解决方案有效,现在我也放弃了COMException
。
答案 0 :(得分:0)
这意味着您无权从Winrt代码中保存该位置的文件。就文件IO权限而言,它被锁定得非常紧张。听起来您没有使用FileSavePicker来保存文件,而是您自己创建filestorage对象并手动指定文件路径位置?
如果您使用FileSavePicker,它将返回一个stroagefile对象,该对象具有在用户选择的任何位置保存文件所需的所有权限。
FileSavePicker savePicker = new FileSavePicker();
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
// Dropdown of file types the user can save the file as
savePicker.FileTypeChoices.Add(this.loadedFile.FileType.Substring(1), new List<string>() { this.loadedFile.FileType });
// Default extension if the user does not select a choice explicitly from the dropdown
savePicker.DefaultFileExtension = this.loadedFile.FileType;
// Default file name if the user does not type one in or select a file to replace
savePicker.SuggestedFileName = file.Name.Trim();
//savePicker.view
StorageFile savedItem = await savePicker.PickSaveFileAsync();
if (savedItem != null)
{
CachedFileManager.DeferUpdates(savedItem);
await FileIO.WriteBytesAsync(savedItem, new byte[0]); //truncate current content in case it already exists
await FileIO.WriteBytesAsync(savedItem, buffer);
await CachedFileManager.CompleteUpdatesAsync(savedItem);
}