我的 Excel VBA 工作表在目录中创建日志。目前,由于我没有删除它们,因此日志不断增加。
但是,现在我只想保留最近的 5 个。我的日志是使用如下文件名创建的:
<worksheet_name>_YYYYMMDD_HH_MM_SS.log
我目前做这项工作的方法是将这些日志放入一个数组中,对数组进行排序,并只保留前 5 个。
我的问题是:有没有人有更好的方法来只保留最近的 5 个日志文件?
这听起来像是一个可行的解决方案。使用 FileSystemObject 库收集所有日志文件,然后循环遍历它们。
一种选择:您可以尝试根据创建日期或修改日期进行删除,即如果文件是在 x 天前创建的,则将其删除。
另外,我不知道这些文件有多重要,但您可能只想将它们移动到名为 Archive 的文件夹中,而不是直接删除它们。
我们不久前使用的一个系统是保留例如 5 个带有“间隙”的日志文件。因此,您将创建前 5 个日志文件:
文件:1,2,3,4,5
然后,在第 6 天,你的差距是 6,所以创建 6 并删除 1
文件:,2,3,4,5,6
差距现在是 1。所以第二天,创建 1,删除 2
文件:1, ,3,4,5,6
差距现在是 2。所以第二天,创建 2,删除 3
文件:1,2, ,4,5,6
等等等等,即“寻找差距”*,用新文件填充它,然后删除它后面的那个。
只是一个想法。
_*(是的,这是一个关于伦敦地铁的坏笑话)
尽管这是一个老问题,但由于我需要这个确切的解决方案,我想我会在这里添加它。此代码假定文件名以可通过字符串比较排序的内容结尾,因此可能是 SomeName_YYYY-MM-DD 格式的文件。也可以包含 24 小时时间戳。此过程不会重命名任何文件,因此任何增量数字方案都需要由其他代码仔细管理(即您要在文件名中添加 _1、_2 等)。
请注意,此解决方案利用了比数组更好地服务于此目的的集合。
Public Sub CleanBackups(filePathAndBaseName As String, fileExtension As String, maxCopiesToKeep As Integer)
'
' Calling Example
' CleanBackups "C:\Temp\MyLog", ".txt", 5
'
' The above example would keep only the 5 versions of the file pattern "C:\Temp\MyLog*.txt"
' that are "LARGEST" in terms of a string comparison.
' So if MyLog_1.txt thru MyLog_9.txt exist, it will delete MyLog_1.txt - MyLog_4.txt
' and leave MyLog_5.txt - MyLog_9.txt
' Highly recommend using pattern MyLog_{YYYY-MM-DD_HhNn}.txt
Dim pathOnly As String
Dim foundFileName As String
Dim oldestFileIndex As Integer
Dim iLoop As Integer
Dim fileNameCollection As New Collection
pathOnly = Left(filePathAndBaseName, InStrRev(filePathAndBaseName, "\"))
foundFileName = Dir(filePathAndBaseName & "*" & fileExtension, vbNormal)
Do While foundFileName <> ""
fileNameCollection.Add foundFileName
foundFileName = Dir
Loop
Do While fileNameCollection.Count > maxCopiesToKeep
' Find oldest file, using only the name which assumes it ends with YYYY-MM-DD and optionally a 24-hour time stamp
oldestFileIndex = 1
For iLoop = 2 To fileNameCollection.Count
If StrComp(fileNameCollection.Item(iLoop), fileNameCollection.Item(oldestFileIndex), vbTextCompare) < 0 Then
oldestFileIndex = iLoop
End If
Next iLoop
Kill pathOnly & "\" & fileNameCollection.Item(oldestFileIndex)
fileNameCollection.Remove oldestFileIndex
Loop
End Sub