什么是无需在 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 即可打开文件进行写入的方法的主要内容,如果未能解决你的问题,请参考以下文章

什么是winRT中的联系合同?

什么是WinRT语言预测?

如何在winrt中播放重叠的音频?

在 WinRT 中绘制二叉树

如何从托管项目中引用本机 WinRT 组件?

WinRT - 获取文件和目录列表[重复]