4

別のアプリケーションがファイルを更新している間に、ロックの競合が発生しないように、テキスト ファイルを開いて内容を読み取ることはできますか?

イベントが発生するたびに別のアプリケーションによって更新される、あるアプリケーションのログ ファイルを監視する必要があります。

ファイルを読み取ろうとする前に、ファイルが使用中かどうかを確認しますが、すべての場合に機能するとは限りません。

ありがとう、ピーター

4

8 に答える 8

10

最初のアプリがそのファイルを開く方法によって異なります。

つまり、CreateFile API を呼び出してファイルを開く場合、API にファイルを開く方法を指示する dwShareMode パラメータがあります (これに 0 を指定すると、他のアプリケーション IIRC からアクセスできなくなります)。それ以外の場合は、そのファイルからの読み取りに問題はありません。間違っていなければ、そのファイルが読み取り専用で開かれているかどうかを確認するには、次のようなものを呼び出すことができます

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
于 2009-04-10T08:59:50.957 に答える
1
  1. Sysinternals から Process Monitor をダウンロードします。
  2. フィルタ ダイアログを開き、ログ ファイルの「パス」フィルタを追加します。
  3. ログ書き込みアプリケーションを開始します (これを「ログライター」と呼びます)。
  4. logwriter が CreateFile を実行するイベントを探してクリックします。
  5. [詳細] の下に、[必要なアクセス: 一般的な書き込み] が表示されます。FILE_SHARE_READまた、CreateFile の呼び出しに対応する "ShareMode: Read" が含まれている必要があります。それが意味することは、「私、ログライターは、他の人が私のファイルを読むことを許可する」ということです。
  6. ここで、ログ読み取りアプリケーション ("logreader") を実行し、同じ演習を行います。
  7. 詳細には、「必要なアクセス: 一般的な読み取り」が必要です。また、「ShareMode: Read, Write」が必要です。これは、「私、ログリーダーは、ログライターを含む他のユーザーにログ ファイルの読み取りと書き込みを許可する」ことを意味します。

これらは最も賢明な値であり、ロックを防ぐことができると思います。他の組み合わせも可能です。ここにテーブルがあります。

さて、あなたはそれが「すべての場合にうまくいくとは限らない」場合に何が起こるかを述べていません. 次に何をすべきかは、詳細に大きく依存します。うまくいけば、上記が何が問題なのかを解決するのに十分な情報を提供します.

于 2009-04-11T01:28:08.790 に答える
0

書き込みアプリケーションがファイルをロックする可能性はほとんどないため、ロックの競合は発生しません。あなたが提案したことを行うことは、一般的に問題なく機能し (UNIX のtail -fコマンドが行うことです)、発生するマイナーな不具合は無視できます。過去に、このように機能するログ監視アプリをいくつか作成しましたが、問題はありませんでした。

于 2009-04-10T08:33:14.267 に答える
0

FileSystemWatcherを使用して、ファイルが更新されたときにイベントを取得してみてください。

より Delphi に適したリンク

于 2009-04-10T08:35:03.687 に答える
0

XpoLog は、環境やコードを変更せずにトリックを実行します。XpoLog ログ モニター

于 2009-12-02T13:49:44.177 に答える
0

「Tail for win32」を使用し、

私はそれがデルファイではないことを知っていますが、役に立つかもしれません

http://tailforwin32.sourceforge.net/

于 2009-12-03T04:21:32.700 に答える
0

他のプログラムの要求によっては不可能な場合があるファイル共有を正しく機能させることとは別に、一部のプログラムはアクセスの合間にファイルを閉じます。

私は過去に、プログラムがファイルが利用可能になるのを待ってから、すぐにファイルを開き、必要なデータを取得して閉じることで成功しました。少なくとも DOS では、ロックされたファイルにアクセスしようとすると数回の再試行が発生したため、この設定を増やして、私がファイルを持っているときに他のプログラムがファイルを試みた場合、単に遅延してエラーが表示されないようにしました。

他のプログラムが何も知らずに、ファイルを更新することさえできました(途中で閉じないようにしました!)。

罪のように醜いですが、他のプログラムを変更できなかったので、それが仕事を成し遂げる唯一の方法でした。何年も社内で展開されていましたが、そのシステムのユーザーからのぞき見は聞いたことがありません。他のプログラムが制御する機械が引退したとき、それは最終的に消えました.

于 2009-04-11T01:40:50.443 に答える
0

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.

于 2009-12-02T14:56:35.210 に答える