我正在尝试清除/删除我的 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
等权限。
我在这里缺少什么?任何帮助都适用
这里有一些问题和事项需要考虑。
首先,您不需要
WRITE_EXTERNAL_STORAGE
和 MANAGE_EXTERNAL_STORAGE
权限来读取和写入应用程序的私有缓存和应用程序数据文件夹。
要获取应用程序缓存目录的路径,您可以简单地使用 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
}
}
您的删除代码可以简化。您可以使用 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);
}
最后但并非最不重要的一点是,您的界面似乎要求您实现将清除缓存作为可等待任务的方法。但是,在您的实现中,除了等待立即返回的
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?
}
}
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);
}
}
}