0

私の Excel VBA ワークシートはディレクトリにログを作成します。現在、ログを削除していないため、ログが蓄積され続けています。

ただし、現在は最新の 5 つだけを保持したいと考えています。ログは次のようなファイル名で作成されます。

<worksheet_name>_YYYYMMDD_HH_MM_SS.log

この仕事を行う私の現在の方法は、これらのログを配列に入れ、配列をソートし、最初の 5 つだけを保持することです。

私の質問は次のとおりです。最新の 5 つのログ ファイルのみを保持するより良い方法はありますか?

4

3 に答える 3

1

それは実行可能な解決策のように聞こえます。FileSystemObject ライブラリを使用してすべてのログ ファイルを収集し、それらをループ処理します。

1 つのオプション: 作成日または更新日に基づいて削除を試みることができます。つまり、ファイルが x 日以上前に作成された場合は削除します。

また、これらのファイルがどれほど重要かはわかりませんが、完全に削除するのではなく、Archive というフォルダーに移動することをお勧めします。

于 2012-11-27T20:10:55.557 に答える
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 に答える
0

少し前に使用したシステムの 1 つは、たとえば 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

etc etc ie "Find the Gap" *、新しいファイルで埋めてから、その後のファイルを削除します。

ただのアイデア。

_* (はい、これはロンドンの地下鉄に言及した悪い冗談です)

于 2012-11-28T15:59:02.693 に答える