【问题标题】:How to determine if a directory is on same partition如何判断一个目录是否在同一个分区
【发布时间】:2008-10-30 10:45:42
【问题描述】:

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

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

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)

【问题讨论】:

    标签: python linux macos filesystems


    【解决方案1】:

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

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

    【讨论】:

    • 请注意,这在 Windows 上不起作用,这会使所有驱动器的 st_dev 为 0。 (对于提问者来说可能不是问题,因为他指定了 osX 和 linux 标签)
    【解决方案2】:

    另一种方法是“请求宽恕而不是许可”的方法——尝试重命名它,如果失败,抓住适当的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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多