我的Excel VBA工作表在目录中创建日志。目前,日志不断增加,因为我没有删除它们。
但是,现在我只想保留最新的5.我的日志是用文件名创建的,如下所示:
<worksheet_name>_YYYYMMDD_HH_MM_SS.log
我目前执行此工作的方法是将这些日志放入数组中,对数组进行排序,并仅保留前5个。
我的问题是:有没有人有更好的方法只保留最近的5个日志文件?
答案 0 :(得分:1)
这听起来像是一个可行的解决方案。使用FileSystemObject库收集所有日志文件,然后循环它们。
一个选项:您可以尝试根据创建日期或修改日期进行删除,即如果文件是在x天前创建的,则删除它。
另外,我不知道这些文件有多重要,但您可能只想将它们移动到名为Archive的文件夹而不是彻底删除它们。
答案 1 :(得分:0)
我们前一段时间使用过的一个系统是带有“间隙”的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
等等 即“找到差距”*,用新文件填充,然后删除后面的文件。只是一个想法。
_ *(是的,这是一个讲伦敦地铁的坏笑话)
答案 2 :(得分:0)
即使这是一个老问题,因为我需要这个确切的解决方案,我想我会在这里添加它。此代码假定文件名以可通过字符串比较排序的内容结束,因此可以是格式为SomeName_YYYY-MM-DD的文件。也可以加入二十四小时的时间戳。此过程不会重命名任何文件,因此任何增量数字方案都需要由其他代码仔细管理(即您要将_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