7

I want to determine whether or not a file is located on a local hard drive or a drive mounted from the network in OSX. So I'd be looking to produce code a bit like the following:

file_name = '/Somewhere/foo.bar'
if is_local_file(file_name):
    do_local_thing()
else:
    do_remote_thing()

I've not been able to find anything that works like is_local_file() in the example above. Ideally I'd like to use an existing function if there is one but failing that how could I implement it myself? The best I've come up with is the following but this treats mounted dmgs as though they're remote which isn't what I want. Also I suspect I might be reinventing the wheel!

def is_local_file(path):
    path = path.split('/')[1:]
    for index in range(1,len(path)+1):
        if os.path.ismount('/' + '/'.join(path[:index])):
            return False
    return True

I have two functions which generate checksums, one of which uses multiprocess which incurs an overhead to start off with but which is faster for large files if the network connection is slow.

4

2 に答える 2

2

「チェックサムを生成する関数が 2 つあります。そのうちの 1 つはマルチプロセスを使用しており、最初はオーバーヘッドが発生しますが、ネットワーク接続が遅い場合は大きなファイルの処理が高速になります。」

次に、あなたが本当にis_local_file()伝えようとしているのは、「ファイル アクセスが思ったよりも遅くならないか?」の代わりの手段にすぎません。代理尺度としては、上記のすべての混乱する理由 (ローカルだが仮想化されたディスク、リモートだが非常に高速な NAS など) のために、本当に知りたいことの指標としては比較的貧弱です。

プログラムで答えるのがほぼ不可能な質問をしているので、「この実行を並列化する」と明示的に言う-jobsオプションのように、オプションを提供することをお勧めします。make

于 2012-07-25T12:38:53.113 に答える
1

ファイルのマウントポイントを見つけるには、既存のコードを使用できます (またはHow to find the mountpoint a file exists on?のソリューションを試してください)。/proc/mounts次に、デバイスとファイルシステムを見つけるために読み取ります。/proc/mountsフォーマットあり

device mountpoint filesystem options...

このフィールドを使用して、filesystemafs、cifs、nfs、smbfs などの既知のネットワーク ファイルシステムを自動的に除外できます。それ以外の場合は、デバイスを見ることができます。基本的なヒューリスティックとして、デバイスがデバイス ノード ( stat.S_ISBLK) であるかnone、ファイル システムがおそらくローカルである場合。URI スタイル ( host:/path) の場合は、おそらくリモートです。それが実際のファイルである場合、ファイルシステムはディスクイメージであり、再帰する必要があります。

于 2012-07-25T12:16:45.613 に答える