2016-04-29 3 views
2

ファイルの内容が他のプロセスによって書き込まれているかどうかを検出したいファイル。 これはWindows上にあり、Python(2.7.x)を使用しています。他のプロセスで使用中のファイルが同じ名前に変更しようとしているかどうかを調べる(WindowsのPythonで)

(ちなみに、Pythonスクリプトは、指定されたフォルダに置かれたファイルに対して動作するサービスを提供しています。検出されるとすぐにファイルに作用し、そのファイルを処理した後にファイルを削除します私は、部分的にしか書かれていないファイルに作用したくない)。

私は、ファイルが同じ名前に変更しようとすると、プロセス)、ファイルが別のプロセスで使用されていない場合は(null-opとして)成功します。このような 何か:

def isFileInUse(filePath): 
    try: 
     os.rename(filePath, filePath) 
     return False 
    except Exception: 
     return True 

送信元と送信先が同じであるとき、私はos.renameの行動についての文書化は何を見ていません。 誰かが私が上でやっていることで間違っているかもしれない何かを知っていますか?

私は、Windowsで動作する解決策、 を探していますが、os.accessが機能していないことに注意してください。os.W_OKでもファイルが別のファイルによって書き込まれていてもTrueを返しますプロセス。

上記の解決策(同じ名前に名前を変更)に関して素晴らしいことの1つは、それが原子であることです。これは、一時名に名前を変更して元の名前に戻すと真ではありません。

+0

これはこれを行うための逆の方法のようです。ファイルを書き込むプログラムは、一時名に書き込む必要があります。それが終わったら、実際の名前に変更してください。 – Barmar

+2

チェックを実行した直後に誰かが書き込みを開始した場合、ファイルが開かれている別のステップとしてファイルが使用されているかどうかを検出しようとすると競合状態になりがちです。 – user2357112

+1

これはあなたの質問に役立つトピックかもしれません:http://stackoverflow.com/questions/11114492/check-if-a-file-is-not-open-not-used-by-other-process-in-python –

答えて

0

ファイルを読みたいだけなので、なぜそれをやろうとしないのですか?

try: 
    with open("file.txt", "r") as handle: 
     content = handle.read() 
except IOError as msg: 
    pass # error handling 

これはコンテンツを読み込もうとします。ファイルがロックされているか、読み込めないと失敗します。

ファイルを読み込みたいだけの場合は、ファイルがロックされているかどうかを確認する必要はありません。読み込みを試み、例外がスローされたかどうかを確認してください。

+0

上記のコメントへの返信で述べたように、私のPythonスクリプトは、ファイルが表示されるとすぐに指定されたフォルダに置かれたファイルに対して機能するサービスを提供しています。そして、それらのファイルを操作した後でファイルを削除します。だから私は、部分的にしか書かれていないファイルの内容に基づいて行動し始めたくないので、ファイルがもはや書き込まれていないときを検出する必要があります。 –

+0

他のプロセスが 'dwShareMode == 0 ' でファイルをオープンしない限り、他のプロセスが標準のCRT機能を使用している場合は、これは正しく動作しません。 Windows上のPythonは、他人の書き込み用に開いたファイルを楽しく読み込みます。 – robyschek

関連する問題