当Documents文件夹位于OneDrive上的已知文件夹移动(KFM)下时,从KnownFolders.DocumentsLibrary读取文件失败(E_ACCESSDENIED)

时间:2019-03-28 19:55:37

标签: win-universal-app windows-10-universal

我有一个应用使用KnownFolders.DocumentsLibraryStorageFolder/StorageFile读取文件。 在Onedrive接管Documents文件夹之前,我的应用正常运行。 因此,声明了应用清单中的所有功能/文件类型关联。

我尝试声明broadFileSystemAccess功能,但结果相同。

StorageFolder folder = Windows.Storage.KnownFolders.DocumentsLibrary;
string content = await FileIO.ReadTextAsync("file.txt", 
Windows.Storage.Streams.UnicodeEncoding.Utf8);

我希望像以前一样读取文件,但是现在我得到了

{System.UnauthorizedAccessException: (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) }

1 个答案:

答案 0 :(得分:0)

KnownFolders.DocumentsLibrary进行了清楚的解释。

  

文档库不适用于一般用途。有关更多信息,请参见App capability declarations

     

如果您的应用程序必须创建和更新仅由您的应用程序使用的文件,请考虑使用该应用程序的LocalCache文件夹。

     

或者,让用户使用文件选择器选择文件位置。有关更多信息,请参见Open files and folders with a picker

因此,如果您没有特定要求,建议您使用ApplicationData Folder或文件夹和文件选择器。

  

文档与其他应用共享,因此唯一的公共位置是文档。文件选择器不是一个选项。主要问题是One Drive接管了该文件夹,因为该应用程序已经运行了好几年。

如果必须使用DocumentsLibrary,则可以遵循KnownFolders.DocumentsLibrary文档在清单文件中添加 Documents Library 功能,并至少注册一个File Type Association声明。然后您可以从那里读取文件。

StorageFolder folder = Windows.Storage.KnownFolders.DocumentsLibrary;
var files = await folder.GetFilesAsync();
foreach (var f in files)
{
     string text = await Windows.Storage.FileIO.ReadTextAsync(f);
     Debug.WriteLine(f.DisplayName + ": " + text);
}
<Extensions>
    <uap:Extension Category="windows.fileTypeAssociation">
      <uap:FileTypeAssociation Name="appdoc">
        <uap:SupportedFileTypes>
          <uap:FileType>.txt</uap:FileType>
        </uap:SupportedFileTypes>
      </uap:FileTypeAssociation>
    </uap:Extension>
  </Extensions>
 ....
 <Capabilities>
    <Capability Name="internetClient" />
    <uap:Capability Name="documentsLibrary" />
 </Capabilities>