7

我想确定文件是否位于本地硬盘驱动器或 OSX 中从网络安装的驱动器上。因此,我希望生成类似于以下内容的代码:

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

我无法找到与is_local_file()上述示例类似的任何东西。理想情况下,如果有一个现有功能,我想使用现有功能,但如果没有,我怎么能自己实现它?我想出的最好的是以下,但这将安装的 dmgs 视为它们是远程的,这不是我想要的。我也怀疑我可能正在重新发明轮子!

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

我有两个生成校验和的函数,其中一个使用多进程,这会产生开销,但如果网络连接速度较慢,则对于大文件来说更快。

4

2 回答 2

2

“我有两个生成校验和的函数,其中一个使用多进程,开始时会产生开销,但如果网络连接速度较慢,则对于大文件来说更快。”

那么你真正想要is_local_file()告诉你的只是“文件访问会比我想要的慢吗?”的代理措施。作为一种代理措施,由于上述所有令人困惑的原因(本地但虚拟化的磁盘、远程但速度极快的 NAS 等),它对于您真正想知道的内容的指示相对较差。

由于您要问一个几乎不可能以编程方式回答的问题,因此最好提供一个选项,就像明确表示“并行化此运行”的-jobs选项一样。make

于 2012-07-25T12:38:53.113 回答
1

您可以使用现有代码(或尝试如何找到文件所在的挂载点?)来查找文件的挂载点;然后读取/proc/mounts以查找设备和文件系统;/proc/mounts有格式

device mountpoint filesystem options...

您可以使用该filesystem字段自动排除已知的网络文件系统,例如 afs、cifs、nfs、smbfs。否则,您可以查看设备;作为一个基本的启发式方法,如果设备是设备节点(stat.S_ISBLK)或者none文件系统可能是本地的;如果它是 URI 样式 ( host:/path),那么它可能是远程的;如果它是实际文件,则文件系统是磁盘映像,您需要递归。

于 2012-07-25T12:16:45.613 回答