从可移动存储Windows Store / RT访问文件

时间:2014-02-15 22:29:48

标签: c# windows-runtime windows-store-apps access-denied storagefile

我正在尝试开发Windows RT设备的应用程序。我目前面临的问题是基于下一个用例场景:

  • 用户定义名为“Song”的结构,其中包含各种字段(标题,艺术家等),包括使用FileOpenPicker类选择的音频文件。

我想将此结构保存在包含所提供信息(标题,艺术家, FullPathToAudio 等)的JSON文件中,并稍后加载该结构。打开现有歌曲后,我想访问音频文件并提供播放按钮。

问题是,当我尝试通过StorageFile.GetFileFromPathAsync(currentSong.FullPathToAudio)访问该文件时,应用程序关闭。我已检查Package.appxmanifest文件的 Capabilities 选项卡中的可移动存储框,并为音频文件(MP3)添加了FileTypeAssociation。

Package.AppxManifest文件已更改如下:

<Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="JamAid.App">
      <m2:VisualElements DisplayName="JamAid" Square150x150Logo="Assets\Logo.png" Square30x30Logo="Assets\SmallLogo.png" Description="JamAid" ForegroundText="light" BackgroundColor="#464646">
        <m2:SplashScreen Image="Assets\SplashScreen.png" />
      </m2:VisualElements>
      <Extensions>
        <Extension Category="windows.fileTypeAssociation">
          <FileTypeAssociation Name="mpfiles">
            <DisplayName>Mp3 Files</DisplayName>
            <EditFlags OpenIsSafe="true" />
            <SupportedFileTypes>
              <FileType ContentType="audio/mp3">.mp3</FileType>
            </SupportedFileTypes>
          </FileTypeAssociation>
        </Extension>
      </Extensions>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="internetClient" />
    <Capability Name="removableStorage" />
  </Capabilities>

由于用户可能会创建包含大量歌曲的播放列表,因此无法复制应用程序目录或其他可访问位置中的文件...

编辑:我尝试在本地计算机上调试应用程序。现在,它不是仅仅关闭,而是出现以下错误:

  

发生了'System.UnauthorizedAccessException'类型的异常   mscorlib.dll但未在用户代码中处理

     

WinRT信息:无法访问指定的文件或文件夹(讠㣯ü)。   该项目不在应用程序可以访问的位置   (包括应用程序数据文件夹,可通过访问的文件夹)   StorageApplicationPermissions中的功能和持久性项   列表)。验证文件未标记为系统或隐藏文件   属性。

     

其他信息:访问被拒绝。

     

如果存在此异常的处理程序,则程序可能是安全的   继续进行。

1 个答案:

答案 0 :(得分:1)

我发现我可以使用此解决方案:http://www.jonathanantoine.com/2012/08/06/keep-access-to-filesfolders-the-user-granted-you/

基本上,人们必须将位置存储在FutureAccessList

var picker = new FolderPicker();
picker.FileTypeFilter.Add("*.mp3");
var folder = await picker.PickSingleFolderAsync();

StorageApplicationPermissions.FutureAccessList.AddOrReplace(Token, folder);

使用以下方式取回:

var folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(Token);