1

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

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

有什么帮助吗?

干杯院长

4

1 回答 1

1

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

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

于 2012-08-22T03:30:23.247 回答