我有一个WinRT Metro项目,它根据所选项目显示图像。但是,某些选定的图像将不存在。我希望能够做的就是陷入不存在的情况并展示替代方案。
到目前为止,这是我的代码:
internal string GetMyImage(string imageDescription)
{
string myImage = string.Format("Assets/MyImages/{0}.jpg", imageDescription.Replace(" ", ""));
// Need to check here if the above asset actually exists
return myImage;
}
示例电话:
GetMyImage("First Picture");
GetMyImage("Second Picture");
因此Assets/MyImages/SecondPicture.jpg
存在,但Assets/MyImages/FirstPicture.jpg
不存在。
起初我想过使用相当于File.Exists()
的WinRT,但似乎没有。{无需尝试打开文件并捕获错误,我可以简单地检查文件是否存在,或者文件是否存在于项目中?
答案 0 :(得分:15)
您可以使用here中的GetFilesAsync
来枚举现有文件。考虑到你有多个可能不存在的文件,这似乎是有道理的。
获取当前文件夹及其子文件夹中所有文件的列表。根据指定的CommonFileQuery对文件进行过滤和排序。
var folder = await StorageFolder.GetFolderFromPathAsync("Assets/MyImages/");
var files = await folder.GetFilesAsync(CommonFileQuery.OrderByName);
var file = files.FirstOrDefault(x => x.Name == "fileName");
if (file != null)
{
//do stuff
}
修改强>
正如@Filip Skakun指出的那样,资源管理器有一个资源映射,你可以在其上调用ContainsKey
,它也可以检查合格的资源(即本地化,缩放等)。
编辑2:
Windows 8.1引入了一种获取文件和文件夹的新方法:
var result = await ApplicationData.Current.LocalFolder.TryGetItemAsync("fileName") as IStorageFile;
if (result != null)
//file exists
else
//file doesn't exist
答案 1 :(得分:6)
有两种方法可以处理它。
1)尝试获取文件时捕获FileNotFoundException:
Windows.Storage.StorageFolder installedLocation =
Windows.ApplicationModel.Package.Current.InstalledLocation;
try
{
// Don't forget to decorate your method or event with async when using await
var file = await installedLocation.GetFileAsync(fileName);
// Exception wasn't raised, therefore the file exists
System.Diagnostics.Debug.WriteLine("We have the file!");
}
catch (System.IO.FileNotFoundException fileNotFoundEx)
{
System.Diagnostics.Debug.WriteLine("File doesn't exist. Use default.");
}
catch (Exception ex)
{
// Handle unknown error
}
2)正如mydogisbox建议的那样,使用LINQ。虽然我测试的方法略有不同:
Windows.Storage.StorageFolder installedLocation =
Windows.ApplicationModel.Package.Current.InstalledLocation;
var files = await installedLocation.GetFilesAsync(CommonFileQuery.OrderByName);
var file = files.FirstOrDefault(x => x.Name == fileName);
if (file != null)
{
System.Diagnostics.Debug.WriteLine("We have the file!");
}
else
{
System.Diagnostics.Debug.WriteLine("No File. Use default.");
}
答案 2 :(得分:2)
BitmapImage
有一个ImageFailed
事件,如果无法加载图像,则会触发该事件。这可以让你尝试加载原始图像,然后如果不存在则做出反应。
当然,这需要您自己实例化BitmapImage
,而不是仅仅构建Uri
。
答案 3 :(得分:0)
检查c ++ / cx资源可用性的示例(使用Windows Phone 8.1测试):
std::wstring resPath = L"Img/my.bmp";
std::wstring resKey = L"Files/" + resPath;
bool exists = Windows::ApplicationModel::Resources::Core::ResourceManager::Current->MainResourceMap->HasKey(ref new Platform::String(resKey.c_str()));