如何在Python中确定文件是否是远程文件

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

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

2
看一下 os.split()、os.splitext() 和 os.sep,它们可能对你现有的代码有帮助(并非直接回答你的问题)。 - Levon
3
你对于从远程文件系统中找到的磁盘映像挂载的文件系统上的文件感觉如何? - SingleNegationElimination
抱歉,应该是 os.path.split()os.path.splitext() -- 在我添加缺失的 path 之前,我错过了编辑窗口。 - Levon
1
@TokenMacGuy 很好的问题,我开始理解为什么它不是 Python 的内置函数了,有很多的条件和限制。嗯,也许需要重新考虑一下这个问题。 - redrah
2
文件系统非常努力地呈现抽象,即存在单个文件命名空间。您没有说明您打算完成什么任务,但是如果您打破了这种精心构建的同质性,就会有阻止我做我真正想做的事情的风险。当然,将交换文件挂载到SMB / NFS / AFS上是愚蠢的,但系统无法正确猜测我正在做错误的事情。 - msw
显示剩余7条评论
2个回答

2
我有两个生成校验和的函数,其中一个使用多进程方式,虽然一开始会产生开销,但如果网络连接较慢且文件较大,则速度更快。

那么你真正寻找的是 is_local_file(),这只是告诉你“文件访问是否比我想象中更慢”的代理措施。作为代理措施,它相对而言并不是一个很好的指标,因为有许多混淆因素(本地但虚拟化磁盘、远程但超级快的 NAS 等等)。

由于你在问一个几乎无法以程序方式回答的问题,因此最好提供一个选项,就像 make 上的 -jobs 选项一样,它明确表示“并行运行”。


1

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

device mountpoint filesystem options...

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

1
在 Mac 上,/proc/mounts 没有文件系统类型列吗?在 Linux 上是有的。(但这仍然不是 100% 可靠的,因为 fuse 文件系统可能是本地、远程甚至是内存中的。)顺便说一下,检查路径是否指向块设备比检查它是否在 /dev 中更加清晰。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接