检查文件系统是否支持硬链接。

3
我正在编写一个备份脚本,使用硬链接来避免占用未修改文件的空间。
我想在脚本开始时检查给定目录所在的文件系统是否支持硬链接。否则,当第一个硬链接需要创建时,脚本可能会在复制多个文件的过程中中断并抛出异常(我可以通过恢复更改或将硬链接静默更改为完全复制来恢复,但我真的不想要这两者 - 我只是不想开始如果它会遇到这个问题)。
那么,如果唯一可用的输入是包含目录位置的字符串(例如“F:\ Backups”或类似内容),如何检查文件系统是否支持硬链接?
如果无法实现上述功能,是否有一种好的方法来检查特定目录所在的文件系统类型?我想可以先获取该信息,然后从那里确定是否支持硬链接。

1
你能否在脚本的开头创建一个“虚拟”符号链接,如果它抛出异常,则说明不支持? - Anon.
@Anon 那肯定可以,但这种方式感觉不是很“干净”。 - DMA57361
唯一确定的方法就是尝试。注意,NTFS支持硬链接,但它们很少使用,因此可能会让用户感到困惑。 - Glenn Maynard
1个回答

5
我会这样解决这个问题:复制文件有三种选择:
  1. On Unix, you can use os.link.
  2. On Windows, you can use a function like this:

    def CreateHardLink(src, dst):
        import ctypes 
        if not ctypes.windll.kernel32.CreateHardLinkA(dst, src, 0):
            raise OSError
    

    (Disclaimer: I haven't tested it. The idea is to use the kernel32 API.)

  3. If all this fails, you can still make a regular file copy (for example, with shutil.copy2).
然后,您可以使用临时文件(稍后将被删除)在脚本开头测试这3个函数。这3个函数中第一个成功的函数(即不引发任何异常的第一个函数)是制作实际备份副本的好选择。
这个想法遵循strategy pattern,其中您必须选择一个函数,该函数接受源文件名和目标文件名,并尽最大努力按照您想要的方式进行复制。
让我再补充一件事:为了选择复制策略而检测文件系统并不是一个很好的做法,就像在Javascript中检测浏览器并不是一个好的做法来执行不同的操作一样。最好尝试使用功能,并准备捕获异常或处理错误以产生替代结果。

我已经在使用1和2的组合,不想回到常规复制。然而,浏览器参数是一个非常好的理由... 嗯... 是时候重新考虑了。感谢您的输入! - DMA57361

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