删除子文件夹中的文件并删除空文件夹

Deleting Files in Subfolder and delete empty Folders

我必须编写一个插件(在 VB.NET 中),在设定的天数后删除文件。我一直在使用此代码 "delete" 所有早于 DataAge 的文件:

出于测试目的,我使用 Log(file.Name) 而不是 file.Delete()

Dim directory As New IO.DirectoryInfo(.PluginXML.DeleteDirectory)  //.PluginXML.DeleteDirectory = FilePath

    For Each file As IO.FileInfo In directory.GetFiles()
        If (Now - file.CreationTime).Days > .PluginXML.DataAge Then Log(file.Name)  //.PluginXML.DataAge = FileAge

    Next

如何检查 .PluginXML.DeleteDirectory 的子文件夹中的旧 files/empty 文件夹? 我试过这样的东西,但它会删除文件夹,而不是旧文件。

    For Each folder As IO.DirectoryInfo In directory.GetDirectories()
        If (Now - folder.CreationTime).Days > .PluginXML.DataAge Then Log(folder.FullName)
    Next

一个选项是使用 overload of GetFiles (or even better*, EnumerateFiles) that accepts a SearchOption,您可以指定它递归所有目录。例如:

For Each file As FileInfo In directory.EnumerateFiles("*.*", SearchOption.AllDirectories)
    If (Now - file.CreationTime).Days > .PluginXML.DataAge Then Log(file.Name)
Next

另一种方法是使用 EnumerateDirectories:

创建一个遍历目录树的递归函数
Public Sub ProcessDirectory(directory as DirectoryInfo, dataAge as Integer) 
    For Each file As FileInfo In directory.EnumerateFiles()
        If (Now - file.CreationTime).Days > dataAge Then Log(file.Name)
    Next
    For Each subDir as DirectoryInfo In directory.EnumerateDirectories()
       ProcessDirectory(subDir, dataAge) 
    Next
End Sub

然后使用您的 base/root 路径调用该方法

Dim rootDir As New DirectoryInfo(.PluginXML.DeleteDirectory)
ProcessDirectory(rootDir, .PluginXML.DataAge)

但请注意,当目录不可访问时,您可能需要添加错误处理,例如抛出 UnauthorizedAccessExceptionSecurityException 时。

* GetFiles 一次将所有文件加载到内存中,而 EnumerateFiles returns 一个 IEnumerable<FileInfo> 将结果流式传输。如果您正在处理包含大量文件的目录,尤其是在使用 AllDirectories 选项时,这会很有用。