递归删除目录中的文件,但保持目录结构不变

8
为了清理测试文件,我正在尝试执行以下操作。但它既没有清除文件,也没有生成错误。
我是否漏掉了什么明显的东西?
    private void CleanUpTempDirFiles()
    {
        var fileGenerationDir = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "TestFilesDir"));

        fileGenerationDir.GetDirectories().ToList().ForEach(dir => dir.GetFiles().ToList().ForEach(file => file.Delete()));
    }

试用调试器。它可以帮助您确定程序在运行时的操作,这比仅仅查看代码来寻找错误要好得多。 - usr
这段代码示例不是在删除您的子文件夹中的文件吗?还是您想要删除主文件夹中的文件? - Gustav Klimt
这并不完全是递归的。理论上它只会删除顶级目录下直接包含的文件夹中的文件。这是您的意图吗? - wdavo
你的代码只删除子目录中的文件。你需要这样做 => fileGenerationDir.GetFiles().ToList().ForEach(file => file.Delete()); - Azhar Khorasany
@wdavo:同意!我想从所有子目录中删除。我已按Tilak建议的更改,并且可以正常工作。 - Codex
5个回答

9

您可以使用 SearchOption.AllDirectories 获取所有子目录中的所有文件。

 fileGenerationDir.GetFiles("*", SearchOption.AllDirectories).ToList().ForEach(file=>file.Delete());

1

这样就可以了:

        string[] filePaths = Directory.GetFiles(
            Path.Combine(Path.GetTempPath(), "TestFilesDir")
            , 
            "*", 
            SearchOption.AllDirectories);

        foreach (var filePath in filePaths)
            File.Delete(filePath);

1

您首先使用了GetDirectories,它返回临时文件夹中的所有子目录。因此,它不会返回此目录中的文件。所以您可能想要改为这样:

var tempDir = Path.Combine(Path.GetTempPath(), "TestFilesDir");
var allFilesToDelete = Directory.EnumerateFiles(tempDir, "*.*", SearchOption.AllDirectories);
foreach (var file in allFilesToDelete)
    File.Delete(file);

移除了 ToLists 并使用了 SearchOption.AllDirectories,该选项可以递归搜索。

如何:遍历目录树 (C# 编程指南)


0
private void CleanUpTempDirFiles() {
        var fileGenerationDir = new DirectoryInfo(
            Path.Combine(Path.GetTempPath(), "TestFilesDir"));

        fileGenerationDir.GetFiles().ToList().ForEach(file => file.Delete());            
    }

0
如果文件存储在TestFilesDir文件夹中,您不必获取其子目录,只需使用以下命令:
fileGenerationDir.GetFiles().ToList().ForEach(file => file.Delete());

否则你只会删除子文件夹中的文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接