【问题标题】:How delete file in localstorage on winrt?如何在winrt上删除localstorage中的文件?
【发布时间】:2013-02-20 11:18:14
【问题描述】:

我尝试删除本地存储中的文件,但没有成功。没错,我拍了一张照片,我想稍后用一个按钮删除它,例如。但是当我点击按钮时,应用程序错误并且我有:“访问被拒绝”。

在 StorageFile 中获取文件后,我使用了一个简单的 Delete.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();

            }


    }

【问题讨论】:

  • 也许文件是在其他地方打开的?如果您可以在图片控件中看到它或类似的东西,则删除无法运行
  • 我会朝那个方向看
  • 如果您将照片加载到 BitmapDecoder 或 BitmapImage 中,只要您未指定 BitmapCacheOption.OnLoad,只要使用 BitmapDecoder 或 BitmapImage,它就会被锁定。然后你也会被拒绝访问。
  • 我仍然无法删除...有什么想法吗?
  • 我正在使用波纹管删除我的应用程序的所有数据。等待 ApplicationData.Current.ClearAsync();

标签: c# windows-8 windows-runtime local-storage storagefile


【解决方案1】:

试试下面的代码,看看它是否适合你。

    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 
        }
    }

【讨论】:

  • 这个解决方案的问题是第二个“GetFileAsync”操作不会返回'null',给定Windows RT的当前实现。相反,当“GetFileAsync”找不到请求的文件时,它会创建并返回一个空文件,因此,使用此代码,您将永远无法确认删除相关文件。一个更好的解决方案是在 try/catch 块中调用等待的“DeleteAsync”函数,然后处理异常——如果没有错误和有问题的第二次“GetFileAsync”调用,异常将表明请求的删除失败。
【解决方案2】:

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

StorageFile filefound = await ApplicationData.Current.LocalFolder.GetFileAsync("myImg.jpg"); 而不是 myImg.jpg 用户想要删除其他文件然后用户将如何删除

【讨论】:

    【解决方案3】:
        /// <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;
        }
    

    【讨论】:

    • DeleteAsync在什么情况下会抛出异常? Intellisense 并不表示可能会引发任何异常。此外,如果文件存在,是否保证成功?
    • 如果文件不存在,它实际上会抛出FileNotFoundException。我认为没有任何理由将DeleteAsync 调用放在try/catch 中,因为如果可以创建StorageFile 对象,它就存在。 MSDN 上没有建议如果文件不存在则返回一个空的StorageFile 对象;因此,if (fDelete != null) 就足够了。我也不认为访问是一个问题,因为您会自动获得对本地存储的访问权限。
    • try/catch 语法是一种习惯——块中还有其他语句可能会引发异常——我没有将我的代码定制为不会引发异常的罕见位,而是将它们全部封装起来。我使用了太多错误的程序,没有花时间 try() 任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    相关资源
    最近更新 更多