删除时如何跳过文件

How to skip files while deleting

提问人:StackUseR 提问时间:10/30/2023 最后编辑:Theodor ZouliasStackUseR 更新时间:10/31/2023 访问量:68

问:

我正在构建一个控制台应用程序来删除 .我在 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 deniedFile in use

我想要什么?

我想单击显示 - 的复选框,然后单击 。do this for all current itemsskip

我无法弄清楚如何实现这一点。如果有人能帮我解决这个问题,那将非常有帮助。提前致谢。

C# 删除文件 system.io.directory

评论

0赞 Tim Schmelter 10/30/2023
因此,即使您使用 ?您使用什么操作系统?是否可以以管理员身份运行应用?这应该可以防止访问被拒绝try-catch
0赞 Orion 10/30/2023
查看答案 有没有办法检查文件是否正在使用中?
0赞 Panagiotis Kanavos 10/30/2023
@Orion与仅仅调用和捕获异常相比,这没有任何好处。Delete

答:

2赞 Panagiotis Kanavos 10/30/2023 #1

首先,您不应该尝试删除可能被其他应用程序使用的文件夹。这将破坏应用程序,并很容易导致数据丢失。

如果您只是尝试在 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));