使用 URI 从“共享/传输”访问文件不再适用于 WP8 应用程序
Posted
技术标签:
【中文标题】使用 URI 从“共享/传输”访问文件不再适用于 WP8 应用程序【英文标题】:Accessing files from "shared/transfers" using a URI does not work for a WP8 app anymore 【发布时间】:2013-09-23 09:03:10 【问题描述】:我有一个可在 WP7 和 WP8 设备上成功运行的 WP7 应用程序。在应用程序中,我使用BackgroundFileTransfer
服务下载音频文件并将文件存储到shared/transfers
文件夹。然后,我通过为下载的文件位置提供 URI 来创建 AudioTrack
s。
Uri episodeLocation;
try
using (IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication())
Debug.WriteLine(" *** Creating track, file exists: " + iso.FileExists("shared/transfers/song.mp3"));
episodeLocation = new Uri("shared/transfers/song.mp3", UriKind.Relative);
catch(Exception)
return null;
return new AudioTrack(episodeLocation,
"Track name",
"Album name",
"",
new Uri("/path/to/logo", UriKind.Relative));
这在 Windows Phone 7 和 Windows Phone 8 设备上都非常有效 - 音频播放器能够很好地播放曲目。如果文件存在,调试输出将打印True
作为测试结果。
我现在已将 Visual Studio 2012 中的应用程序转换为 Windows Phone 8 应用程序。如果我现在在 Windows Phone 8 中运行该应用程序,我会收到来自播放器的 System.IO.FileNotFoundException
外部异常。同样在转换后的版本中,当检查文件是否存在时,调试输出会打印True
。
我只是将应用程序从 WP7 转换为 WP8 应用程序,我无法再引用 shared/transfers
中的文件。
为什么?
这样做的正确方法是什么?
我已经尝试使用 URI isostore:/shared/transfers/song.mp3
来引用文件,但这似乎没有效果。
【问题讨论】:
事实上,似乎将音频文件移动到任何其他目录甚至根目录都会产生相同的结果:FileExists() 返回 true,但音频播放器抛出 FileNotFound 异常。 【参考方案1】:我所做的是我现在创建了一个全新的空 WP8 项目,然后我将所有旧代码从 WP7 项目复制到这个新的 WP8 项目,然后我重新构建了解决方案。我没有对我写这篇文章时的版本进行任何代码修改,我从一个 WP7 项目转换为一个 WP8 并且有问题。
音频播放器又可以播放音频文件了。
因此,对任何拥有 WP7 项目的人的建议:不要在 Visual Studio 中将它们转换为 WP8 项目,因为可能会发生奇怪的事情。
【讨论】:
您是否将转换后的 .csproj 与新创建的 .csproj 进行了比较?有什么区别? 我没有比较。我没有时间修复微软的错误。 没有人谈论修复错误,这只是一种好奇心 :) 没关系【参考方案2】:好的 - 我觉得我找到了 - 在我的情况下,问题是我的 BackgroundDowload 需要一个 Uri 文件位置,我这样创建 Uri:
fileName = "shared/transfers/my filename.txt";
fileName = Uri.EscapeUriString(fileName);
Uri fileUri = new Uri(fileName, UriKind.Relative);
无论有没有上述代码的第二行,文件都会保存到转义字符串格式的位置。似乎是这样,因为它是作为 Uri 提供的。 该文件已下载,正如您所提到的,它已创建并存在,如 FileExists() 所示。 我有我的“转义”文件名,当我想(例如)播放音频时,我会这样做:
return new AudioTrack(new Uri(Uri.EscapedUriString(fileName), UriKind.Relative), title ....);
希望它能帮助你,因为它对我有用。
【讨论】:
在我的情况下,我的文件名中没有空格,所以我们的情况明显不同。 空白只是这里的例子。试试看,还要检查什么 string[] str = ISF.GetFileNames("/shared/transfers/");返回。如果您在 returned filenames (str) 中没有任何特殊字符,那么我不知道(目前)什么可以解决您的问题。以上是关于使用 URI 从“共享/传输”访问文件不再适用于 WP8 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Facebook 登录按钮(在 LOCALHOST 上。):登录按钮插件不再适用于 http 页面
如何使用文件URI从运行springboot的docker镜像访问本地文件?