2

読みたいファイルがあります。ファイルはいつでも別のプロセスによって上書きされる可能性があります。私はその書き込みをブロックしたくありません。読み取ったデータの破損を管理する準備はできていますが、読み取りによって書き込みプロセスの動作が変更されることは望んでいません。

ファイルを書き込んでいるプロセスは、サーバー上でローカルに実行されている Delphi プログラムです。fmCreate を使用してファイルを開きます。fmCreate はファイルを排他的に開こうとし、ファイルに他のハンドルがある場合は失敗します。

ネットワーク経由でファイルにリモートでアクセスする python スクリプトからファイルを読み取っています。

PythonまたはDelphiでサポートされているかどうかに関係なく、解決策があるかどうかに興味があります。書き込みプログラムを変更せずに、ウィンドウでこれを実現する方法があるかどうかを知りたいです。

編集: 繰り返しますが、これは重複ではありません。もう 1 つの質問は、書き込み中のファイルへの読み取りアクセスを取得しようとすることでした。読み取り用に開いているファイルにライターがアクセスできるようにします。これらは異なる質問です(答えは似ているのではないかと思いますが、それはできません。)

4

2 に答える 2

2

ここでの本当の答えは、ここ数年後、日和見ロックを使用することだと思います。これにより、別のプログラムがファイルにアクセスしたい場合に通知を受けたいことをOSに伝えながら、読み取りアクセス用にファイルを開くことができます。基本的に、好きなだけファイルを使用し、他の人が必要になったら元に戻すことができます。これにより、ファイルを「通常どおり」開いた場合に、他のプログラムが通常取得する共有/アクセス違反が回避されます。

Opportunistic Locks に関する MSDN の記事があります。Raymond Chen もこれに関するブログ記事を公開しており、サンプル コードを完備しています。

重要なのは、フラグをDeviceIoControl使用して関数を呼び出し、 を呼び出して以前に作成したイベントへのハンドルを渡すことです。FSCTL_REQUEST_OPLOCKCreateEvent

これは Windows API 関数の呼び出しをサポートしているため、Delphi から簡単に使用できます。Pythonについてはよくわかりません。ただし、質問の取り決めを考えると、Python コードを変更する必要はありません。Delphi コードがファイルを開くときに日和見ロックを使用するようにし、Python スクリプトがファイルを必要とするときに邪魔にならないようにします。

また、フィルター ドライバーやボリューム シャドウ コピー サービスよりもはるかに簡単で軽量です。

于 2021-10-12T07:59:54.053 に答える
0

次の 2 つの方法で機能するフィルター ドライバーをセットアップできます。(1) ファイルが開かれるときにフラグを変更し、(2) ファイルに書き込まれるときにデータをキャプチャし、データのコピーを別の場所に保存します。

このアプローチは、コメントで言及されているボリューム シャドウ コピー サービスよりもはるかに軽量で効率的ですが、フィルター ドライバーが必要です。市場にはいくつかのドライバーが存在します (つまり、それらはドライバーを含み、ユーザー モードでビジネス ロジックを記述できる製品です)。それでも、私的使用のみが必要な場合は、個人的に私に連絡して、CallbackFilter のライセンスを取得してください。

更新: 既に開かれているファイルをライターに開かせたい場合は、ファイルが開かれているときにフラグを変更するフィルターが唯一のオプションです。

于 2013-01-31T06:37:03.243 に答える