如何确定一个目录是否在同一分区上

假设我有一个input文件和一个目标目录。 如何确定input文件是否与目标目录位于相同的硬盘驱动器(或分区)上?

我想要做的是复制一个文件,如果它是不同的,但移动它,如果它是相同的。 例如:

target_directory = "/Volumes/externalDrive/something/" input_foldername, input_filename = os.path.split(input_file) if same_partition(input_foldername, target_directory): copy(input_file, target_directory) else: move(input_file, target_directory) 

感谢CesarB的回答,实现了same_partitionfunction:

 import os def same_partition(f1, f2): return os.stat(f1).st_dev == os.stat(f2).st_dev 

在C中,您可以使用stat()并比较st_dev字段。 在python中, os.stat应该这样做。

另一种方法是“更好地请求宽恕比权限”的方法 – 只是尝试重命名它,如果失败,赶上适当的OSError并尝试复制的方法。 即:

 import errno try: os.rename(source, dest): except IOError, ex: if ex.errno == errno.EXDEV: # perform the copy instead. 

这样做的好处是它也可以在Windows上运行,其中st_dev对于所有分区都是0。

请注意,如果你真的想复制,然后删除源文件(即执行一个移动),而不是只复制,那么shutil.move将已经做你想要的:

帮助功能在模块shutil中移动:

移动(src,dst)
    递归地将文件或目录移动到另一个位置。

    如果目标位于我们当前的文件系统上,那么只需使用
    改名。 否则,将src复制到dst,然后删除src。

[编辑]由于马修Schinckel的评论更新,提到shutil.move将删除复制后的来源,这不一定是想要的,因为问题只是提到复制。