1

私のシナリオは次のとおりです。

実行中にそのアクションを txt ファイルに継続的に記録するプログラムが 1 つあります。実行中にファイルを閉じることはありません。このプログラムを変更することはできません。

このファイルを他のアプリケーション (VB.NET VS 2005 で記述) で監視したい。私の問題は、このログに書き込まれているデータがすぐに登録されないように見えることです。

FileSystemWatch を使用して、ファイルの更新を監視しようとしました。このアプローチの問題は、データが書き込まれたことをすぐに通知されないことです。ただし、エクスプローラーでフォルダーを手動で参照してから並べ替えると、変更されたイベントがトリガーされます (理由は聞かないでください)。ファイルが他のアプリによって閉じられた場合も、おそらく通知を受けるでしょう。

また、ファイルをポーリングして、最後の書き込み日を読み取ろうとしました。これは、書き込みのたびにファイルが閉じられている場合にのみ機能します。

ログに書き込むアプリケーションでファイルを閉じて再度開くか、書き込まれているフォルダーに手動でアクセスせずに、この監視を実行する方法はありますか。

ファイルウォッチのコードは次のとおりです。

    If IO.File.Exists(recorder_path) Then
        Dim recorder_dir As String = recorder_path.Remove(recorder_path.LastIndexOf("\"))
        Dim recorder_name As String = recorder_path.Substring(recorder_path.LastIndexOf("\") + 1)

        recorder_watcher = New System.IO.FileSystemWatcher()
        recorder_watcher.Path = recorder_dir
        recorder_watcher.Filter = recorder_name
        recorder_watcher.NotifyFilter = NotifyFilters.Size
        AddHandler recorder_watcher.Changed, AddressOf recorder_update
        recorder_watcher.EnableRaisingEvents = True
    End If

    Private Sub recorder_update(ByVal source As Object, ByVal event_args As System.IO.FileSystemEventArgs)
        'Do Stuff
    End Sub

私はこのアプリを W7 と XP で実行しており、ローカル フォルダーにのみアクセスしています。

UPDATE、別のアプローチ:

以下のコードは十分に速く動作するようです:

    Dim new_txt As String = ""

    Dim fs As New FileStream(recorder_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    Dim file_reader = New StreamReader(fs)
    file_reader.ReadToEnd()

    While 1
        new_txt = ""
        System.Threading.Thread.Sleep(5)
        System.Windows.Forms.Application.DoEvents()

        new_txt += file_reader.ReadToEnd().ToUpper()
        If (new_txt.Length > 0)
           'Do stuff w/new txt
        End If
    End While

これにより、ログ プロセスがファイルに書き込むたびに更新が行われるようです。

ありがとう、

イアン

4

1 に答える 1

2

確かに FileSystemWatcher はあまり役に立たず、ファイルを定期的に読み取ることは役に立ちますが、他のプロセスがファイルを読み取ることができる共有モードでファイルが開かれている場合に限ります。

別の方法は、すべての書き込み操作を即座にキャッチするファイルシステム フィルター ドライバーを使用することです。これは、ファイルが置かれているのと同じシステムにドライバーがインストールされている場合に機能します (つまり、フィルターはリモート ディスクでは機能しません)。

于 2012-12-20T07:02:16.663 に答える