1

アプリケーション パッケージにファイルが存在するかどうかを確認するルーチンを作成しようとしています。この件についてたくさん読んだ後、MSがFileExists関数をAPIに入れるのを忘れていたことは明らかですが(意図的かどうかにかかわらず)、これが私が今のところどこにいるのかです...

    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);
        }
    }

基本的に、画像がローカルに存在するかどうかを確認し、存在しない場合は私のウェブサイトから取得します。

最初の画像ではすべて正常に動作しているように見えますが、「return this._image;」になると、2番目の画像では、すべてがフリーズします...

ここで何が起こっているのか本当にわかりません..

何か助けはありますか?

乾杯ディーン

4

1 に答える 1

1

ファイルをチェックしてからそのファイルを開こうとすると、競合状態になります。つまり、存在のチェックとオープンの間にファイルを削除できます。ですから、そのようにしてはいけません。GetFile から GetFileAsync の例外をキャッチするのは正しいですが、FileNotFoundExceptionをキャッチする必要があり、ファイルが存在しなかったことがわかります。

ただし、CheckFile のコードはおかしな動作をします。すべての例外を飲み込み、メッセージ ボックスを表示し、try ブロックで何が起こっても found = true を設定する内部の try-catch ブロックがあります。それはあなたが意図していることではないと思います。また、新しい MessageDialog または ShowAsync を作成して例外をスローする場合 (つまり、found を false に設定した場合) にのみヒットするため、周囲の try-catch ブロックは必要ありません。

于 2012-08-22T03:30:23.247 に答える