我正在尝试编写一个例程来检查应用程序包中是否存在文件。在阅读了很多关于这个主题的内容之后,显然MS忘了在API中放置一个FileExists函数(故意与否),但到目前为止我处于这里......
public async Task<bool> CheckFile(string filePath)
{
bool found = false;
try
{
Windows.ApplicationModel.Package package = Windows.ApplicationModel.Package.Current;
Windows.Storage.StorageFolder installedLocation = package.InstalledLocation;
StorageFile file = await installedLocation.GetFileAsync("Assets\\" + filePath);
found = true;
}
catch (System.IO.FileNotFoundException ex)
{
found = false;
}
return found;
}
然后从:
打来电话 private ImageSource _image = null;
private String _imagePath = null;
public ImageSource Image
{
get
{
if (this._image == null && this._imagePath != null)
{
Task<bool> fileExists = CheckFile(this._imagePath);
bool filefound = fileExists.Result;
string realPath = string.Empty;
if (filefound)
{
Windows.ApplicationModel.Package package = Windows.ApplicationModel.Package.Current;
Windows.Storage.StorageFolder installedLocation = package.InstalledLocation;
realPath = installedLocation + "Assets\\" + this._imagePath;
}
else
{
realPath = "http://<<my url>>/images/" + this._imagePath;
}
this._image = new BitmapImage(new Uri(realPath));
}
return this._image;
}
set
{
this._imagePath = null;
this.SetProperty(ref this._image, value);
}
}
所以基本上是检查图像是否存在于本地,如果不存在则从我的网站上获取。
这一切似乎对第一张图片都很好,但是当它变成“返回this._image;”时对于第二张图片,一切都冻结......
我只是不确定这里到底发生了什么......
任何帮助?
干杯 迪安
答案 0 :(得分:1)
检查文件然后尝试打开该文件是竞争条件。也就是说,可以在检查存在和打开之间移除文件。所以,你不应该这样做。你是正确的从GetFile中捕获来自GetFileAsync的异常,但你应该抓住FileNotFoundException,然后你知道该文件不存在。
但是,CheckFile的代码做了一些有趣的事情。你有一个内部try-catch块,它将吞没所有异常,显示一个消息框,然后设置found = true,无论try块中发生了什么。我认为这不是你想要的。此外,周围的try-catch块不是必需的,因为它只会在创建一个新的MessageDialog或ShowAsync时抛出异常 - 即当你将find设置为false时 - 这不是我认为你想要的。