删除子文件夹中的文件并删除空文件夹
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)
但请注意,当目录不可访问时,您可能需要添加错误处理,例如抛出 UnauthorizedAccessException
或 SecurityException
时。
* GetFiles
一次将所有文件加载到内存中,而 EnumerateFiles
returns 一个 IEnumerable<FileInfo>
将结果流式传输。如果您正在处理包含大量文件的目录,尤其是在使用 AllDirectories
选项时,这会很有用。
我必须编写一个插件(在 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)
但请注意,当目录不可访问时,您可能需要添加错误处理,例如抛出 UnauthorizedAccessException
或 SecurityException
时。
* GetFiles
一次将所有文件加载到内存中,而 EnumerateFiles
returns 一个 IEnumerable<FileInfo>
将结果流式传输。如果您正在处理包含大量文件的目录,尤其是在使用 AllDirectories
选项时,这会很有用。