提问人:StackUseR 提问时间:10/30/2023 最后编辑:Theodor ZouliasStackUseR 更新时间:10/31/2023 访问量:68
删除时如何跳过文件
How to skip files while deleting
问:
我正在构建一个控制台应用程序来删除 .我在 SO 中引用了多个站点和页面。但不幸的是,没有得到太多。appdata/local/temp
到目前为止,我做了什么:
方法1: Directory.Delete(folderPath, true);
方法 2:递归删除
public static void RecursiveDelete(DirectoryInfo baseDir)
{
if (!baseDir.Exists)
return;
foreach (var dir in baseDir.EnumerateDirectories())
{
RecursiveDelete(dir);
}
baseDir.Delete(true);
}
方法3: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 上删除整个文件夹,您将丢失 VS Code 或 Sublime 中所有未处理的文件,但没有费心保存在特定文件夹中。%TEMP%
在 .NET Core(包括 .NET 5 及更高版本)中,可以忽略无法访问的文件和文件夹。
通过将参数传递给 EnumerateFiles,始终可以进行递归搜索:SearchOption.AllDirectories
var allFiles=baseDir.EnumerateFiles("*",SearchOption.AllDirectories);
.NET Core 添加了一个重载,该重载接受 EnumerationOptions 对象,该对象允许忽略无法访问的文件夹和对象:
var options=new EnumerationOptions {
RecuresSubdirectories=true,
IgnoreInaccessible=true
};
var allFiles=baseDir.EnumerateFiles("*",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.EnumerateFiles("*",options)
.Where(file=>file.LastAccessTime=DateTime.Now.AddDays(-7));
评论
try-catch
Delete