12

我有一个 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不存在。

起初我想使用 WinRT 等价物File.Exists(),但似乎没有。无需尝试打开文件并捕获错误,我可以简单地检查文件是否存在,或者文件是否存在于项目中?

4

4 回答 4

15

您可以使用GetFilesAsyncfrom here枚举现有文件。考虑到您有多个可能不存在的文件,这似乎很有意义。

获取当前文件夹及其子文件夹中所有文件的列表。根据指定的 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
于 2012-08-25T13:03:58.093 回答
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.");
 }
于 2012-08-27T01:31:24.040 回答
2

BitmapImageImageFailed如果无法加载图像,则会触发一个事件。这将让您尝试加载原始图像,然后在它不存在时做出反应。

当然,这需要您实例化BitmapImage自己,而不仅仅是构建Uri.

于 2012-08-25T14:03:00.193 回答
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()));
于 2015-09-08T16:40:19.293 回答