什么是无需在 WinRT、Win8 中使用 Open File Picker 即可打开文件进行写入的方法
Posted
技术标签:
【中文标题】什么是无需在 WinRT、Win8 中使用 Open File Picker 即可打开文件进行写入的方法【英文标题】:What is a way to open file for writing wihout having to use OpenFilePicker in WinRT, Win8 【发布时间】:2014-11-23 19:27:03 【问题描述】:我已经为此工作了几天,并为此奋斗了两年。粗略地说,我有一个应用程序,用户在其中打开文件,长时间编辑,然后保存或暂停直到以后。我有一个可以工作的自动保存功能,但是,我也想要一个自动存档功能(以防用户想要自动保存到备份文件,而不是覆盖当前文件)。
粗略地说,我想在编辑文件时创建一个新文件,希望原始文件在哪里。但是,我很快就放弃了,因为微软不允许在没有明确的选择器访问权限的情况下访问 Skydrive、其他目录等进行写入。
但是,我想也许我可以使用文档库。但是这里的任何使用似乎都会给我 NullReferenceException。这是我正在尝试的示例(注意 .ged 文件与我的应用程序相关联):
string backupFileName = openStorageFile + "-backup.ged";
StorageFolder currentFolder;
StorageFile fileCopy;
try
// try to set up Backup file in the same directory as the source file
currentFolder = await selectedFile.GetParentAsync();
fileCopy = await openStorageFile.CopyAsync(currentFolder, backupFileName, NameCollisionOption.ReplaceExisting);
// Success return
return;
catch
// The failed... try something else
Debug.WriteLine("INFO: Failed to set up backup file in the source file's directory, trying backup option");
try
// try to set up Backup file in the same directory as the source file
fileCopy = await openStorageFile.CopyAsync(KnownFolders.DocumentsLibrary, backupFileName, NameCollisionOption.ReplaceExisting);
catch
// The failed... try something else
Debug.WriteLine("INFO: Failed to set up backup file in the source document library, no other option available");
粗略地说,从原始文件开始第一次调用 GetParentAsync 是有效的。但是 CopyAsync 到该目录失败并出现 NullReferenceException。
第二次尝试使用 DocumentsLibrary。它在 CopyAsync 上也失败并出现 NullReferenceException。
我试过这个: Windows 8 StorageFile.GetFileFromPathAsync Using UNC Path
根据 MSDN,只要我的应用程序与 .ged 文件相关联(确实如此),我就不应该有问题。还有什么可以尝试的吗?
【问题讨论】:
【参考方案1】:您需要添加documentsLibrary 功能以访问文档库。不鼓励使用此功能,并且不会在 Visual Studio 的清单设计器中公开此功能。您必须直接编辑 package.appxmanifest 的 xml
<Capabilities>
<Capability Name="internetClient" />
<Capability Name="documentsLibrary" />
</Capabilities>
我确认您的代码在添加后保存到文档库中,并修复了 backupFileName 设置器以使用 openStorageFile 的名称。从代码中的其他引用来看,openStorageFile 是 StorageFile 而不是字符串。
string backupFileName = openStorageFile.Name + "-backup.ged";
如果您需要应用通过商店认证而不是旁加载,请参阅功能文档的Special use capabilities section,了解使用文档库的更多限制。
我会将备份保存在应用程序的本地数据中,而不是文档库中。该应用可以在用户需要时公开一种从备份恢复到选定位置的方法。
【讨论】:
谢谢。我明白你在说什么,它隐藏得很好,并且在技术上违反了使用规则。我决定使用 ApplicationData.Current.LocalFolder。它仍然感觉不是最理想的,但我可以解决这个问题。以上是关于什么是无需在 WinRT、Win8 中使用 Open File Picker 即可打开文件进行写入的方法的主要内容,如果未能解决你的问题,请参考以下文章