2

ファイルがまだ転送されているかどうかを確認するために stat を使用していますが、機能していません。ネットワークを介して大きなファイルをコピーすると (数百ギガバイト、数分かかる場合があります)、スクリプトを実行します。

from os import stat
from time import sleep
While True:
    stat("thefile.foo")
    sleep(2)

時間またはサイズのいずれかが変化することを期待していますが、同じままです。ファイルがまだ転送中であるかどうかを確認するために使用できるものは他にありますか? 残念ながら、これはWindowsサーバー上にあります。

統計が更新されないスクリーンショット

実際にファイルを読み取るために、このスクリプトを試しました:

import sys
finished=False
oldgb=0
while not finished:
f=open(thefile,"rb")
samp=f.read(1)
gb=0
while samp!= b'':
    sys.stdout.flush()
    gb+=1000000000
    f.seek(gb)
    samp=f.read(1)
    print(gb/1000000000,samp)       
f.close()
print(oldgb, gb)
if gb>oldgb:
    oldgb=gb
else:
    finished=True

ファイルのコピー中に、まだコピーされていないバイトがゼロに初期化されたため、ファイルサイズが更新されていないことに気付きました。代わりにチェックサムを使用して、ファイルが変更されたかどうかを確認する場合があります。

4

1 に答える 1

2

これがハッカリな解決策です。最初にsysinternalshandle.exeをインストールしました。これを使用して、ファイルに開いているハンドルがあるかどうかを確認します。つまり、次のようになります。

import subprocess
from time import sleep
filename="file.foo"
finished = False
while not finished:
    handlesactive=subprocess.check_output("handle.exe")
    activehandles=str(handlesactive).count(filename)
    if activehandles == 0: finished = True
    print("still busy")
    sleep(2)

編集:これは、マシン自体で転送されるファイルに対して機能します。たとえば、あるローカルファイルから別のローカルファイルにコピーされますが、ファイルが外部マシンによって転送される場合、ファイルハンドルは作成されません。ただし、その場合、ファイルのmtime変更されます(幸いなことに)。

したがって、フォルダをスキャンして新しいファイルをチェックするスクリプトで使用する場合は、ハンドルのチェック(ローカルファイルの場合)とmtimeとサイズのチェック(外部ファイルの場合)を組み合わせて使用​​することになりました。

于 2013-01-22T06:22:48.537 に答える