2013-02-20 4 views
6

私はローカルストレージ内のファイルを削除するために成功しません。正確には、私は写真を撮ったと私は後でボタンを使用してそれを削除したい。しかし、私がボタンをクリックすると、アプリのバグと私は持っている: "アクセスが拒否されました"。winrtのlocalstorageでのファイルの削除方法は?

私はStorageFileでファイルを取得した後、簡単なDelet.Async()を実行します。

private async void delete_click(object sender, RoutedEventArgs e) 
    { 

      StorageFile filed = await ApplicationData.Current.LocalFolder.GetFileAsync("myImg.jpg"); 
      if (filed != null) 
      { 
       await filed.DeleteAsync(); 

      } 


    } 
+3

を削除する方法を、他のファイルをdelteしたいですか?あなたがそれを見ることができないようなピクチャコントロールやsometingで見ることができたら –

+0

その方向に見てみましょう – Sw1a

+3

BitmapDecoderまたはBitmapImageに写真を読み込んだ場合、BitmapDecoderまたはBitmapImageがロックされている限りロックされますBitmapCacheOption.OnLoadを指定しない場合に使用されます。その後、アクセスが拒否されます。 –

答えて

7

以下のコードを試してみてください。

private async void takephoto_click(object sender, RoutedEventArgs e) 
    { 


     var ui = new CameraCaptureUI(); 
     ui.PhotoSettings.CroppedAspectRatio = new Size(4, 3); 
     var file = await ui.CaptureFileAsync(CameraCaptureUIMode.Photo); 

     if (file != null) 
     { 
      // store the file 
      var myFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("myImg.jpg"); 
      await file.MoveAndReplaceAsync(myFile); 

      // display the file 
      var bitmap = new BitmapImage(); 
      bitmap.SetSource(await file.OpenAsync(FileAccessMode.Read)); 
      Photo.Source = bitmap; 
     } 



    } 

    private async void delete_click(object sender, RoutedEventArgs e) 
    { 
     StorageFile filed = await ApplicationData.Current.LocalFolder.GetFileAsync("myImg.jpg"); 
     if (filed != null) 
     { 
      await filed.DeleteAsync(); 
     } 

     StorageFile filefound = await ApplicationData.Current.LocalFolder.GetFileAsync("myImg.jpg"); 

     if (filefound != null) 
     { 
      // do something here 
     } 
    } 
+0

私はそれを試みます。ありがとう – Sw1a

+0

このソリューションの問題は、WIndows RTの現在の実装では、2番目の "GetFileAsync"操作で「null」が返されないことです。代わりに、 'GetFileAsync'が要求されたファイルを見つけるのに失敗すると、空のファイルを作成して返します。このコードでは、問題のファイルの削除を決して確認できません。 try/catchブロック内で待たれている 'DeleteAsync'関数を呼び出してから例外を処理することが、優れた解決策です。例外は、バグがあり問題の多い2番目の 'GetFileAsync'呼び出しを必要としません。 – Epsilon3

0

ローカルストレージからファイルを削除する際に同じ問題が発生しています。他のファイルを削除する方法のように、ローカルストレージにはさまざまな名前で多くのファイルが保存されています。上記の場合は、削除するファイル名をハードコードしています。

StorageFile filefound = ApplicationData.Current.LocalFolder.GetFileAsync( "myImg.jpg");待機します。 代わりのmyImg.jpgのユーザはおそらく、ファイルがいくつかの他にどこ開かれ

0
/// <summary> 
    /// Delete the indicated application file 
    /// </summary> 
    /// <param name="strFilePathName">The file path name to delete</param> 
    /// <returns>True, if successful; else false</returns> 
    public async static Task<bool> DeleteAppFile(string strFilePathName) 
    { 
     try 
     { 
      StorageFile fDelete = null; 

      if (!strFilePathName.Equals("")) 
      { 
       fDelete = await ApplicationData.Current.LocalFolder.GetFileAsync(strFilePathName); 
       if (fDelete != null) 
       { 
        try 
        { 
         await fDelete.DeleteAsync(); 
        } 
        catch (Exception ex) 
        { 
         AFFECTS.App.ShowMessage(true, "Error", "DeleteAppFile {" + strFilePathName + "}", ex.Message); 

         return false; 
        } 

        return true; 
       } 
      } 
      else 
       AFFECTS.App.ShowMessage(true, "Error", "DeleteAppFile", "File path name is empty."); 
     } 
     catch (Exception ex) 
     { 
      AFFECTS.App.ShowMessage(true, "Error", "DeleteAppFile {" + strFilePathName + "}", ex.Message); 
     } 

     return false; 
    } 
+0

'DeleteAsync'が例外をスローする条件は? Intellisenseは、例外がスローされる可能性があることを示していません。さらに、ファイルが存在する場合、成功は保証されていますか? –

+0

ファイルが存在しない場合、実際には 'FileNotFoundException'がスローされます。私は、 'StorageFile'オブジェクトが作成できれば存在するので、' Try/catch'に 'DeleteAsync'呼び出しを入れる理由はないと思います。 MSDNには、ファイルが存在しない場合は空の 'StorageFile'オブジェクトが返されることを示唆するものは何もありません。したがって、if(fDelete!= null) 'で十分でしょう。私はローカルストレージへのアクセスが自動的に許可されているため、アクセスは問題ではないと思います。 –

+0

try/catch構文は習慣的です。ブロック内に例外をスローする可能性のある他のステートメントがあります。私のコードを珍しいビットに合わせるのではなく、すべてカプセル化します。私は何かを試す時間がかからないバグの多いプログラムを使用しています。 – Epsilon3

関連する問題