2

私のプログラムは、ユーザーが既にクライアントに持っている可能性のある Windows ファイル システムからファイルをコピーし、アプリのサムネイル/プロファイル画像である既存の画像を置き換えたいと考えています。

これを行っている古いImの上に新しい画像を保存するには:

async private void saveImage(string name, int clientId)
    {
        StorageFolder folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfileImages", CreationCollisionOption.OpenIfExists);

        try
        {

            StorageFile newFileImage = await StorageFile.GetFileFromPathAsync(photoImageStoragePath);

            StorageFile originalFileImage = await StorageFile.GetFileFromPathAsync(originalPhotoImageStoragePath);
            await newFileImage.CopyAndReplaceAsync(originalFileImage);

        }
        catch (Exception ex)
        {                
            var name2 = string.Format("{0}_{1}{2}", name, GenerateId(), ".png");                
            copyImageAsync(folder, name2, clientId);
        }


    }

そのため、元の画像が新しい画像に置き換えられています。そこのパスに基づいて、それぞれに新しいストレージ ファイルを作成しています。以前に使用したすべてのファイル ストリームが .disposed() であることを確認したので、アクセスが拒否され続ける理由について少し迷っています。copyandreplaceを使用した場合とmoveandreplaceを使用した場合に取得します。

正確なエラー コードは System.UnauthorizedAccess - {"アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))"}

4

2 に答える 2

0

このリンクが示唆しているように有効にする機能オプションの 1 つかもしれません。「Read Local files w/oa Picker」の部分を見て、ドキュメント ライブラリ アクセスを有効にする方法を説明しています。

注意してください:

StorageFolder についても少しお話します。私が受ける最も一般的な要求の 1 つは、ユーザーのシステムでファイルとフォルダーを反復処理することです。c: から開始することを意味する場合は、実際にはできません。[例外] ただし、ライブラリ (ドキュメント、写真、音楽、ビデオ、さらにはホーム グループ) フォルダー内のファイルを反復処理することはできます。マニフェスト。フォルダーに対して返されるファイルは、マニフェストで宣言したファイルの種類に自動的にフィルター処理されることに注意してください。( .は宣言できないことは既に述べましたか?) 開発者として、最終的にユーザーのエクスペリエンスと安全性を向上させるために、このような意図的な制限を設けていることを繰り返します。

よろしく

于 2013-07-04T07:17:36.050 に答える
0

答えは、保存後に何が起こったかにあると思います.Windows 8メトロアプリでは、保存が開始され、画面が別の画面に遷移し、すべてのクライアントが再度一覧表示されました。

async/await が開始され、画像を保存するプロセスがタスクに開始されたため、save メソッドにはジョブの完了が約束され、プロセスは新しい画面に遷移する UI に戻されます。その新しい画面では、クライアント データを一覧表示するために画像の要求が再度行われます。取得するタスクが優先され、保存タスクがファイルへの新しいイメージの書き込みを完了する前に、古いイメージを表示用にロックしているように見えます。

だから私がやろうとしているのは、画像を持つオブジェクトのメモリ内コレクションを持つことです。ページによって CRUD 操作が開始されると、ページはその TYPEのREPOSITORYを呼び出し、リポジトリはメモリ内コレクションを更新し、ファイルにも書き込みます。これにより、バックグラウンド プロセス/タスクにプッシュされたために更新された、または更新されていない個々のファイルではなく、メモリ内コレクションからページのデータを取得できます。

于 2013-07-12T16:10:51.543 に答える