python - 检查文件系统是否支持硬链接(hard link)

标签 python filesystems

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

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

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

如果做不到这一点,是否有一种很好的方法来检查特定目录所在的文件系统的类型
我想可以把它拉下来,然后从那里算出它是否受支持吗?

最佳答案

我会这样解决这个问题:复制文件有 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)。

然后,您可以在脚本的开头用一个临时文件(稍后删除)来测试这 3 个函数。这 3 个函数中第一个成功的(即第一个没有引发 Exception 的函数)很适合制作实际的备份副本。

这个想法遵循 strategy pattern ,您必须在其中选择一个函数,该函数采用源文件名和目标文件名,并尽最大努力按照您想要的方式制作副本。

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

关于python - 检查文件系统是否支持硬链接(hard link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5010120/

相关文章:

python - Python 内置对象的 __enter__() 和 __exit__() 定义在哪里?

python - 为什么我的代码(与 CUDA 链接)偶尔会导致 Python 中的段错误?

linux - 网络 block 设备 - 某些读取请求失败 - 内核 OOPS

c++ - 确保 fsync 完成其工作

linux - 如何将 bcache 设备还原为常规设备

php - SQL 数据库或文件系统中的照片 (2012)

python - 测试 numpy.dtype 的正确方法

python - 无法让我的函数执行任何操作

python - 如何在 python 中读取从第 7 行到第 265 行的行?

database - 用于数据库操作的 Windows 文件系统有多快?