我正在构建一个控制台应用程序来从
appdata/local/temp
删除文件和文件夹。我在 SO 中引用了多个网站和页面。但遗憾的是没能得到太多。
到目前为止我所做的:
方法一:
Directory.Delete(folderPath, true);
方法二:递归删除
public static void RecursiveDelete(DirectoryInfo baseDir)
{
if (!baseDir.Exists)
return;
foreach (var dir in baseDir.EnumerateDirectories())
{
RecursiveDelete(dir);
}
baseDir.Delete(true);
}
方法三:try-catch
foreach (DirectoryInfo subDir in directoryInfo.GetDirectories())
{
try
{
subDir.Delete();
}
catch (Exception ex)
{
continue;
}
}
foreach (FileInfo file in directoryInfo.GetFiles())
{
try
{
file.Delete();
}
catch (Exception ex)
{
continue;
}
}
这些方法很好,但总是会弹出一个窗口,显示 -
Folder access denied
或 File in use
。
我想要什么?
我想单击显示 -
do this for all current items
的复选框,然后单击 skip
。
我不知道如何实现这一点。如果有人能帮助我解决这个问题,那将非常有帮助。预先感谢。
首先,您不应该尝试仅删除其他应用程序可能正在使用的文件夹。这会破坏应用程序并很容易导致数据丢失。
如果您只是尝试在 Windows 上删除整个
%TEMP%
文件夹,您将丢失 VS Code 或 Sublime 中的所有待处理文件,但不会费心保存在特定文件夹中。
在 .NET Core 中可以开箱即用地忽略无法访问的文件和文件夹,其中包括 .NET 5 及更高版本。
通过将
SearchOption.AllDirectories
参数传递给 EnumerateFile
: 始终可以进行递归搜索
var allFiles=baseDir("*",SearchOption.AllDirectories);
.NET Core 添加了一个重载,它接受 EnumerationOptions 对象,该对象允许忽略无法访问的文件夹和对象:
var options=new EnumerationOptions {
RecuresSubdirectories=true,
IgnoreInaccessible=true
};
var allFiles=baseDir("*",options);
这不会排除正在使用的文件。您仍然需要使用
try/catch
块,但不必担心权限问题:
foreach(var file in allFiles)
{
try
{
file.Delete();
}
catch (Exception ex)
{
Console.WriteLine($"Can't delete {file.FullPath}");
}
}
为了避免删除仍然需要的临时文件,您可以尝试使用 LastAccessTime 属性仅删除一段时间内未修改的临时文件:
var oldFiles=baseDir("*",options)
.Where(file=>file.LastAccessTime=DateTime.Now.AddDays(-7));