2013-02-20 8 views
6

Ich versuche ohne Erfolg eine Datei in meinem lokalen Speicher zu löschen. Genau, ich habe ein Foto gemacht und möchte es später mit einem Knopf zum Beispiel löschen. Aber wenn ich auf die Schaltfläche klicke, die App Fehler und ich habe: "Zugriff verweigert".Wie lösche Datei im lokalen Speicher auf Winrt?

Ich sude eine einfache Delet.Async(), nachdem ich die Datei in einem StorageFile.

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

Vielleicht ist die Datei geöffnet wird einige wo sonst löscht? Wenn Sie es in einem Bild-Steuerelement oder etwas so sehen, konnte das Löschen nicht –

+0

Ich werde in diese Richtung schauen – Sw1a

+3

Wenn Sie das Foto in einen BitmapDecoder oder BitmapImage geladen wurde, wäre es gesperrt, solange der BitmapDecoder oder BitmapImage ist Wird verwendet, wenn Sie BitmapCacheOption.OnLoad nicht angeben. Dann bekommst du auch den Zugriff verweigert. –

Antwort

7

Versuchen Sie den folgenden Code, um zu sehen, ob es für Sie funktioniert.

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

Ich werde das versuchen. Danke – Sw1a

+0

Das Problem mit dieser Lösung ist, dass die zweite "GetFileAsync" -Operation "Null" nicht zurückgibt, angesichts der aktuellen Implementierung von Windows RT. Wenn "GetFileAsync" die angeforderte Datei nicht findet, wird stattdessen eine leere Datei erstellt und zurückgegeben. Mit diesem Code können Sie die Löschung der betreffenden Datei daher nie bestätigen. Eine überlegene Lösung besteht darin, die erwartete "DeleteAsync" -Funktion in einem try/catch-Block aufzurufen und dann die Ausnahme zu behandeln - eine Ausnahme würde einen Fehler der angeforderten Löschung ohne den fehlerhaften und problematischen zweiten "GetFileAsync" -Aufruf anzeigen. – Epsilon3

0

Ich habe dasselbe Problem beim Löschen von Datei aus dem lokalen Speicher. Es gibt viele Dateien im lokalen Speicher mit unterschiedlichen Namen, so dass andere Dateien gelöscht werden können. Im obigen Fall haben Sie den zu löschenden Dateinamen fest codiert.

StorageFile filefound = erwarten ApplicationData.Current.LocalFolder.GetFileAsync ("myImg.jpg"); statt myImg.jpg Benutzer wollen dann andere Datei delte, wie Benutzer

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

Unter welchen Bedingungen kann 'DeleteAsync' eine Ausnahme auslösen? Intellisense gibt nicht an, dass Ausnahmen ausgelöst werden. Wenn die Datei existiert, ist der Erfolg garantiert? –

+0

Es wird tatsächlich 'FileNotFoundException' ausgelöst, wenn die Datei nicht existiert. Ich glaube nicht, dass es einen Grund gibt, den 'DeleteAsync'-Aufruf in einen' try/catch'-Aufruf zu setzen, denn wenn ein 'StorageFile'-Objekt erstellt werden kann, existiert es. In MSDN gibt es nichts, was darauf hindeutet, dass ein leeres 'StorageFile'-Objekt zurückgegeben wird, wenn die Datei nicht existiert. Daher wäre 'if (fDelete! = null)' ausreichend. Ich denke nicht, dass der Zugriff ein Problem ist, weil Ihnen automatisch Zugriff auf den lokalen Speicher gewährt wird. –

+0

Die Try/Catch-Syntax ist Gewohnheit - es gibt andere Anweisungen im Block, die Ausnahmen auslösen können - anstatt meinen Code auf das seltene Bit zuzuschneiden, das nicht alles kapselt. Ich benutze zu viele Buggy-Programme, die sich nicht die Zeit nehmen, etwas zu versuchen(). – Epsilon3

Verwandte Themen