2009-03-25 3 views
3

ファイルへのファイルハンドルが開いているプロセスがあります。このファイルが別のプロセスによって削除されたかどうかを検出する必要があります(その場所に同じ名前のファイルがある可能性があります)。 UNIXでは、ファイルハンドルのinodeとファイルパスのstatを比較していましたが、これはWin32では動作しません。 Perlでどうすればいいですか?Windowsで開いているファイルハンドルのファイルがPerlを使用して削除されたかどうかを検出するにはどうすればよいですか?

おかげで、

答えて

7

私は(私は、Windowsのプログラマではないよ)間違われるかもしれないが、私は、彼らがWin32ので開かれ、または少なくともデフォルトではそれができませんされている場合、ファイルを削除または交換することはできませんと思いました。ファイルまたはディレクトリへの変更の通知を登録するのWin32 :: ChangeNotifyパッケージで

+0

はい、私が知る限り、Windowsでは開いているファイルを削除することはできません。 – Powerlord

+0

はい、これは根本的な問題でした。私は、ファイルを書き込むたびにファイルを再オープンし、一意のファイルID(ボリュームシリアル番号とカーネルが取得したファイルの高/低インデックスを結合して生成したもの)を作成して比較する必要がありましたAPIコール:GetFileInformationByHandle)。 – user24881

1

-Peter
私はサイズ、ファイルのmtime、atimeのとを比較してみたいです。それらは、(Win32でファイルハンドル上のstatに関係なく、あなたのファイルハンドルが削除されたインスタンス上にあるかどうかのあなたのファイルシステム内の現在のファイルの情報を与える、たとえば、などのナンセンスを除けば)同じにするために非常に困難にする必要があります。ファイルが削除され、指定された秒間に複数回同じファイルに置き換えられ、これを検出しなければならない場合は、ファイルの番号付きバージョンなどのアーキテクチャ上の解決策に進む必要があります。

1

ルック。また、Win32API :: Fileパッケージを介してファイルを開くことも可能です(MSDNのCreateFile()や、特にCreateFile()やOsFHandleOpen()を参照)。

2

これは特に、WindowsとUnixの両方の間で、解決するのは難しい問題です。

レッツ・バックアップ。ファイルが置き換えられたのをなぜ検出しようとしていますか?私の推測では、同じファイルに書き込もうとしている2つのプログラムがあります。おそらくファイルロックがここで助けになるでしょうか?または、実際のデータベースを使用しますか? SQLiteとBerkley DBが思い浮かぶ。