使用Excel VBA删除除最近5之外的日志文件

时间:2012-11-27 18:57:12

标签: excel-vba vba excel

我的Excel VBA工作表在目录中创建日志。目前,日志不断增加,因为我没有删除它们。

但是,现在我只想保留最新的5.我的日志是用文件名创建的,如下所示:

<worksheet_name>_YYYYMMDD_HH_MM_SS.log

我目前执行此工作的方法是将这些日志放入数组中,对数组进行排序,并仅保留前5个。

我的问题是:有没有人有更好的方法只保留最近的5个日志文件?

3 个答案:

答案 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