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

时间:2008-10-30 10:45:42

标签: python linux macos filesystems

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

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

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_partition功能:

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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:3)

另一种方式是“更好地请求宽恕而非许可”方法 - 只是尝试重命名它,如果失败,请抓住相应的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已经可以执行您想要的操作:

Help on function move in module shutil:

move(src, dst)
    Recursively move a file or directory to another location.

    If the destination is on our current filesystem, then simply use
    rename.  Otherwise, copy src to the dst and then remove src.

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