0

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

但是,现在我只想保留最近的 5 个。我的日志是使用如下文件名创建的:

<worksheet_name>_YYYYMMDD_HH_MM_SS.log

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

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

4

3 回答 3

1

这听起来像是一个可行的解决方案。使用 FileSystemObject 库收集所有日志文件,然后循环遍历它们。

一种选择:您可以尝试根据创建日期或修改日期进行删除,即如果文件是在 x 天前创建的,则将其删除。

另外,我不知道这些文件有多重要,但您可能只想将它们移动到名为 Archive 的文件夹中,而不是直接删除它们。

于 2012-11-27T20:10:55.557 回答
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

等等等等,即“寻找差距”*,用新文件填充它,然后删除它后面的那个。

只是一个想法。

_*(是的,这是一个关于伦敦地铁的坏笑话)

于 2012-11-28T15:59:02.693 回答
0

尽管这是一个老问题,但由于我需要这个确切的解决方案,我想我会在这里添加它。此代码假定文件名以可通过字符串比较排序的内容结尾,因此可能是 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
于 2014-10-01T14:45:04.533 回答