删除时如何跳过文件

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

我正在构建一个控制台应用程序来从

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

我不知道如何实现这一点。如果有人能帮助我解决这个问题,那将非常有帮助。预先感谢。

c# delete-file system.io.file system.io.directory
1个回答
0
投票

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

如果您只是尝试在 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));
© www.soinside.com 2019 - 2024. All rights reserved.