【问题标题】:Deleting Files in Subfolder and delete empty Folders删除子文件夹中的文件并删除空文件夹
【发布时间】:2020-05-20 07:58:47
【问题描述】:

我必须编写一个插件(在 VB.NET 中),在一定天数后删除文件。我一直在使用此代码“删除”所有早于 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 的子文件夹中的旧文件/空文件夹? 我试过这样的东西,但它会删除文件夹,而不是旧文件。

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

【问题讨论】:

  • 这叫做递归。网络上已经有无数递归文件搜索的例子。

标签: vb.net plugins


【解决方案1】:

一种选择是使用接受SearchOptionoverload of GetFiles(甚至更好*,EnumerateFiles),您可以使用它指定它递归所有目录。例如:

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

然后使用您的基本/根路径调用该方法

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多