2013-02-20 15 views
6

我尝试无法成功删除本地存储中的文件。确实,我拍了一张照片,我想稍后用一个按钮来删除它,例如。但是,当我点击按钮,应用程序错误,我有:“访问被拒绝”。如何在winrt上删除localstorage中的文件?

我得到一个简单的Delet.Async()后,我在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

也许文件被打开了一些地方?如果你可以看到它在一个图片控件或类似的删除无法运行 – 2013-02-20 11:31:54

+0

我会朝着那个方向 – Sw1a 2013-02-20 13:13:35

+3

如果您将照片加载到BitmapDecoder或BitmapImage它将被锁定,只要BitmapDecoder或BitmapImage是如果您未指定BitmapCacheOption.OnLoad,则使用该属性。那么你也会拒绝访问。 – 2013-02-20 15:10:28

回答

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 2013-02-26 08:46:02

+0

此解决方案的问题在于,鉴于当前实现了Windows RT,第二个“GetFileAsync”操作不会返回'null'。相反,当'GetFileAsync'无法找到请求的文件时,它会创建并返回一个空文件,因此,使用此代码,您永远无法确认删除有问题的文件。 一个优越的解决方案是在try/catch块内部调用等待的'DeleteAsync'函数,然后处理异常 - 一个异常将表明所请求的删除失败,而没有错误的和有问题的第二个'GetFileAsync'调用。 – Epsilon3 2015-06-13 15:29:45

0

我在从本地存储中删除文件时遇到同样的问题。本地存储中存在许多不同名称的文件,因此如何删除其他文件。在上述情况下,您已将硬编码的文件名删除。

StorageFile filefound = await 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'会引发异常?智能感知不表示可能抛出任何异常。此外,如果文件存在,是否保证成功? – 2017-03-26 02:50:58

+0

如果文件不存在,它实际上会抛出'FileNotFoundException'。我不认为有必要在'try/catch'中放入'DeleteAsync'调用,因为如果可以创建一个'StorageFile'对象,它就存在。如果文件不存在,MSDN上没有任何内容会提示返回空的“StorageFile”对象;因此,'if(fDelete!= null)'就足够了。我不认为访问是一个问题,或者是因为您被自动授予对本地存储的访问权限。 – 2017-03-26 02:58:31

+0

try/catch语法是习惯 - 块中还有其他可能会抛出异常的语句 - 而不是将我的代码定制为不存在的罕见位,我把它们全部封装起来。我使用太多的bug程序,不花时间去尝试()任何东西。 – Epsilon3 2017-04-07 16:15:00

相关问题