Windows 8 Metro检查文件是否存在

时间:2012-08-22 02:26:02

标签: c# windows-8 microsoft-metro

我正在尝试编写一个例程来检查应用程序包中是否存在文件。在阅读了很多关于这个主题的内容之后,显然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;”时对于第二张图片,一切都冻结......

我只是不确定这里到底发生了什么......

任何帮助?

干杯 迪安

1 个答案:

答案 0 :(得分:1)

检查文件然后尝试打开该文件是竞争条件。也就是说,可以在检查存在和打开之间移除文件。所以,你不应该这样做。你是正确的从GetFile中捕获来自GetFileAsync的异常,但你应该抓住FileNotFoundException,然后你知道该文件不存在。

但是,CheckFile的代码做了一些有趣的事情。你有一个内部try-catch块,它将吞没所有异常,显示一个消息框,然后设置found = true,无论try块中发生了什么。我认为这不是你想要的。此外,周围的try-catch块不是必需的,因为它只会在创建一个新的MessageDialog或ShowAsync时抛出异常 - 即当你将find设置为false时 - 这不是我认为你想要的。