2013-02-20 11 views
6

Próbuję bez powodzenia usunąć plik z mojego lokalnego magazynu. Dokładnie, zrobiłem zdjęcie i chcę je później usunąć za pomocą przycisku na przykład. Ale kiedy kliknę przycisk, błędy aplikacji i mam: "odmowa dostępu".Jak usunąć plik w localstorage na winrt?

Mam prosty plik Delet.Async() po otrzymaniu pliku w pliku 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

Być może plik jest otwarty gdzie indziej? JEŻELI możesz to zobaczyć w formancie obrazkowym lub coś podobnego, to nie można go usunąć –

+0

Będę patrzył w tym kierunku – Sw1a

+3

Jeśli załadowałeś zdjęcie do BitmapDecoder lub BitmapImage, byłby on zablokowany tak długo, jak długo BitmapDecoder lub BitmapImage jest używany, jeśli nie określono opcji BitmapCacheOption.OnLoad. Wtedy otrzymasz także odmowę dostępu. –

Odpowiedz

7

Wypróbuj poniższy kod, aby sprawdzić, czy działa on prawidłowo.

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

Spróbuję tego. Dzięki – Sw1a

+0

Problem z tym rozwiązaniem polega na tym, że druga operacja "GetFileAsync" nie zwróci wartości 'null', biorąc pod uwagę bieżącą implementację systemu WIndows RT. Zamiast tego, gdy "GetFileAsync" nie znajdzie żądanego pliku, tworzy on i zwraca pusty, więc przy pomocy tego kodu nigdy nie będziesz w stanie potwierdzić usunięcia danego pliku. Lepszym rozwiązaniem jest wywołanie oczekiwanej funkcji "DeleteAsync" w bloku try/catch, a następnie obsługa wyjątku - wyjątek oznaczałby niepowodzenie żądanego usunięcia bez kłopotliwego i problematycznego drugiego wywołania "GetFileAsync". – Epsilon3

0

Mam taki sam problem podczas usuwania pliku z pamięci lokalnej. istnieje wiele plików przechowywanych w pamięci lokalnej o różnych nazwach, więc jak usuwać inne pliki. w powyższym przypadku masz zakodowaną na stałe nazwę pliku do usunięcia.

StorageFile filefound = czekać na ApplicationData.Current.LocalFolder.GetFileAsync ("myImg.jpg"); zamiast użytkownik myImg.jpg chcą delte inny plik, a następnie w jaki sposób użytkownik usunie

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

W jakich warunkach "DeleteAsync" może powodować wyjątek? Intellisense nie wskazuje, że mogą być zgłaszane wyjątki. Co więcej, jeśli plik istnieje, czy gwarantuje on sukces? –

+0

W rzeczywistości wyrzuci "FileNotFoundException", jeśli plik nie istnieje. Nie sądzę, że istnieje jakikolwiek powód, aby umieścić wywołanie 'DeleteAsync' w' try/catch', ponieważ jeśli można utworzyć obiekt 'StorageFile', istnieje. W MSDN nie ma nic, co sugerowałoby zwrócenie pustego obiektu 'StorageFile', jeśli plik nie istnieje; w związku z tym 'if (fDelete! = null)' byłoby wystarczające. Nie sądzę, że dostęp jest również problemem, ponieważ automatycznie uzyskujesz dostęp do lokalnej pamięci masowej. –

+0

Składnia try/catch jest przyzwyczajeniem - w bloku są inne wyrażenia, które mogą generować wyjątki - zamiast dopasować mój kod do rzadkiego fragmentu, który nie zawiera, ja je wszystkie hermetyzuję. Używam zbyt wielu błędnych programów, które nie potrzebują czasu, aby spróbować() cokolwiek. – Epsilon3