无法清除 Xamarin.Forms Android 中的应用程序缓存

问题描述 投票:0回答:1

我正在尝试清除/删除我的 Xamarin.forms Android 应用程序的应用程序缓存文件夹。我尝试了不同的代码,但该文件夹仍未被清除。

我做了什么

我通过接口调用这个类。但不管怎样缓存文件夹仍然有数据。

namespace MyApp.Droid.Services
{
    public class CacheClearService: ICacheClearService
    {
        public async Task ClearCacheAsync()
        {
            try
            {
                var cacheDir = Android.App.Application.Context.CacheDir;
                deleteDir(cacheDir);
                await Task.CompletedTask;
            }
            catch (Exception ex)
            {

            }
        }

        public  static bool deleteDir(File dir)
        {
            if (dir != null && dir.IsDirectory)
            {
                string[] children = dir.List();
                for (int i = 0; i < children.Length; i++)
                {
                    bool success= deleteDir(new File(dir, children[i]));
                    if (!success)
                    {
                        return false;
                    }
                }
                return dir.Delete();
            }
            else if (dir != null && dir.IsFile)
            {
                return dir.Delete();
            }
            else
            {
                return false;
            }
        }

    }
}

我添加了

WRITE_EXTERNAL_STORAGE
MANAGE_EXTERNAL_STORAGE
等权限。 我在这里缺少什么?任何帮助都适用

c# xamarin xamarin.forms xamarin.android maui
1个回答
0
投票

这里有一些问题和事项需要考虑。

1.权限

首先,您不需要

WRITE_EXTERNAL_STORAGE
MANAGE_EXTERNAL_STORAGE
权限来读取和写入应用程序的私有缓存和应用程序数据文件夹。

2.使用文件系统助手

要获取应用程序缓存目录的路径,您可以简单地使用 Xamarin.Essentials 包/命名空间的 文件系统助手

using Xamarin.Essentials;

namespace MyApp.Droid.Services
{
    public class CacheClearService : ICacheClearService
    {
        public async Task ClearCacheAsync()
        {
            try
            {
                var cacheDir = FileSystem.CacheDirectory;

                // skipped for brevity
            }
            catch (Exception ex)
            {
            }
        }

        // skipped for brevity
    }
}

3.简化删除代码

您的删除代码可以简化。您可以使用 Directory.Delete(string path, bool recursive) 方法,通过传递路径和

true
作为第二个参数来删除文件和子文件夹,类似于 C# 中的文件和目录的递归删除 :

private static void DeleteDir(string dir)
{
    foreach (string subDir in Directory.GetDirectories(dir))
    {
        DeleteDir(subDir);
    }
    Directory.Delete(dir, true);
}

4.异步/等待

最后但并非最不重要的一点是,您的界面似乎要求您实现将清除缓存作为可等待任务的方法。但是,在您的实现中,除了等待立即返回的

Task.CompletedTask
之外,您不执行任何异步调用,因为它始终处于已完成状态。

相反,您可以将您的阻塞代码(删除文件和文件夹可能需要一段时间)包装在

Task.Run()
语句中,然后可以等待:

public async Task ClearCacheAsync()
{
    try
    {
        await Task.Run(() =>
        {
            var cacheDir = FileSystem.CacheDirectory;
            DeleteDir(cacheDir);
        });
    }
    catch (Exception ex)
    {
        //maybe log the exception here?
    }
}

5.将所有内容整合在一起

namespace MyApp.Droid.Services
{
    public class CacheClearService : ICacheClearService
    {
        public async Task ClearCacheAsync()
        {
            try
            {
                await Task.Run(() =>
                {
                    var cacheDir = FileSystem.CacheDirectory;
                    DeleteDir(cacheDir);
                });
            }
            catch (Exception ex)
            {
                //maybe log the exception here?
            }
        }

        private static void DeleteDir(string dir)
        {
            foreach (string subDir in Directory.GetDirectories(dir))
            {
                DeleteDir(subDir);
            }
            Directory.Delete(dir, true);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.