別のアプリケーションがファイルを更新している間に、ロックの競合が発生しないように、テキスト ファイルを開いて内容を読み取ることはできますか?
イベントが発生するたびに別のアプリケーションによって更新される、あるアプリケーションのログ ファイルを監視する必要があります。
ファイルを読み取ろうとする前に、ファイルが使用中かどうかを確認しますが、すべての場合に機能するとは限りません。
ありがとう、ピーター
別のアプリケーションがファイルを更新している間に、ロックの競合が発生しないように、テキスト ファイルを開いて内容を読み取ることはできますか?
イベントが発生するたびに別のアプリケーションによって更新される、あるアプリケーションのログ ファイルを監視する必要があります。
ファイルを読み取ろうとする前に、ファイルが使用中かどうかを確認しますが、すべての場合に機能するとは限りません。
ありがとう、ピーター
最初のアプリがそのファイルを開く方法によって異なります。
つまり、CreateFile API を呼び出してファイルを開く場合、API にファイルを開く方法を指示する dwShareMode パラメータがあります (これに 0 を指定すると、他のアプリケーション IIRC からアクセスできなくなります)。それ以外の場合は、そのファイルからの読み取りに問題はありません。間違っていなければ、そのファイルが読み取り専用で開かれているかどうかを確認するには、次のようなものを呼び出すことができます
CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
FILE_SHARE_READ
また、CreateFile の呼び出しに対応する "ShareMode: Read" が含まれている必要があります。それが意味することは、「私、ログライターは、他の人が私のファイルを読むことを許可する」ということです。これらは最も賢明な値であり、ロックを防ぐことができると思います。他の組み合わせも可能です。ここにテーブルがあります。
さて、あなたはそれが「すべての場合にうまくいくとは限らない」場合に何が起こるかを述べていません. 次に何をすべきかは、詳細に大きく依存します。うまくいけば、上記が何が問題なのかを解決するのに十分な情報を提供します.
書き込みアプリケーションがファイルをロックする可能性はほとんどないため、ロックの競合は発生しません。あなたが提案したことを行うことは、一般的に問題なく機能し (UNIX のtail -fコマンドが行うことです)、発生するマイナーな不具合は無視できます。過去に、このように機能するログ監視アプリをいくつか作成しましたが、問題はありませんでした。
FileSystemWatcherを使用して、ファイルが更新されたときにイベントを取得してみてください。
より Delphi に適したリンク
XpoLog は、環境やコードを変更せずにトリックを実行します。XpoLog ログ モニター
他のプログラムの要求によっては不可能な場合があるファイル共有を正しく機能させることとは別に、一部のプログラムはアクセスの合間にファイルを閉じます。
私は過去に、プログラムがファイルが利用可能になるのを待ってから、すぐにファイルを開き、必要なデータを取得して閉じることで成功しました。少なくとも DOS では、ロックされたファイルにアクセスしようとすると数回の再試行が発生したため、この設定を増やして、私がファイルを持っているときに他のプログラムがファイルを試みた場合、単に遅延してエラーが表示されないようにしました。
他のプログラムが何も知らずに、ファイルを更新することさえできました(途中で閉じないようにしました!)。
罪のように醜いですが、他のプログラムを変更できなかったので、それが仕事を成し遂げる唯一の方法でした。何年も社内で展開されていましたが、そのシステムのユーザーからのぞき見は聞いたことがありません。他のプログラムが制御する機械が引退したとき、それは最終的に消えました.
Avar is right - you are at the mercy of the writing program here. If they are locking the file, then there are a couple of things you can do:
1 - Check for a change in the "last modified" date time - if that changes, then you know something has happened.
2 - If the mod datetime did change, then (depending on the size of the file) it might be good enough to create a copy of the file and check that.