我想确定文件是否位于本地硬盘驱动器或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
我有两个生成校验和的函数,其中一个函数使用多进程,这会产生开销,但如果网络连接速度慢,则对于大文件来说速度更快。
答案 0 :(得分:2)
“我有两个生成校验和的函数,其中一个函数使用多进程,这会导致开始时的开销,但如果网络连接速度慢,则对于大文件来说速度更快。”
那么你真正想要的is_local_file()
告诉你的只是“文件访问权限会比我想要的慢吗?”的代理措施。作为一种代理措施,对于上面提到的所有混淆原因(本地但虚拟化的磁盘,远程但速度惊人的NAS等),你真正想知道的是一个相对较差的指标。
由于您提出的问题几乎不可能以编程方式回答,因此最好提供一个选项,就像-jobs
上的make
选项明确表示“并行化此运行”一样。
答案 1 :(得分:1)
您可以使用现有代码(或尝试How to find the mountpoint a file resides on?处的解决方案)来查找文件的挂载点;然后阅读/proc/mounts
以找到设备和文件系统; /proc/mounts
具有格式
device mountpoint filesystem options...
您可以使用filesystem
字段自动排除已知的网络文件系统,例如afs,cifs,nfs,smbfs。否则你可以看看设备;作为基本启发式,如果设备是设备节点(stat.S_ISBLK
)或none
,那么文件系统可能是本地的;如果它是URI样式(host:/path
)那么它可能是远程的;如果是实际文件,则文件系统是磁盘映像,您需要递归。