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

时间:2011-02-15 22:11:28

标签: python filesystems

我正在编写一个备份脚本,它使用硬链接不占用未修改文件的空间。

我想检查一个给定的文件系统(由特定目录确定)是否支持脚本 start 的硬链接 - 否则,它可能会中途通过(复制)多个文件)在第一个硬链接需要创建之前,导致脚本掉出异常(我可以通过恢复更改或静默更改硬链接到完整副本来恢复,但我真的不想要 - 我只是宁愿如果要解决这个问题就不要开始了。)

那么,如果唯一可用的输入是包含目录位置的字符串(例如"F:\\Backups"或类似的),我如何检查文件系统是否支持硬链接?

如果失败了,有没有一种方法可以检查特定目录所在的文件系统的类型? 我想可以拉出来然后解决它是否得到支持?

1 个答案:

答案 0 :(得分:3)

我会用这种方式解决这个问题:复制文件有3种选择:

  1. 在Unix上,您可以使用os.link
  2. 在Windows上,您可以使用以下功能:

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

    (免责声明:我没有测试过。想法是使用kernel32 API。)

  3. 如果所有这些都失败了,您仍然可以进行常规文件复制(例如,使用shutil.copy2)。
  4. 然后,您可以使用临时文件(之后删除)在脚本开头测试这3个函数。成功的这3个函数中的第一个(即第一个不引用Exception的函数)是制作实际备份副本的良好候选者。

    这个想法遵循strategy pattern,你必须选择一个获取源文件名和目标文件名的函数,并尽最大努力按照你想要的方式进行复制。

    让我再补充一点:检测文件系统以选择复制策略并不是一个很好的做法,就像检测浏览器不是在Javascript中做不同事情的好习惯一样。最好尝试使用某个功能,并准备捕获异常或处理错误,以便产生替代结果。