我正在编写一个备份脚本,它使用硬链接不占用未修改文件的空间。
我想检查一个给定的文件系统(由特定目录确定)是否支持脚本 start 的硬链接 - 否则,它可能会中途通过(复制)多个文件)在第一个硬链接需要创建之前,导致脚本掉出异常(我可以通过恢复更改或静默更改硬链接到完整副本来恢复,但我真的不想要 - 我只是宁愿如果要解决这个问题就不要开始了。)
那么,如果唯一可用的输入是包含目录位置的字符串(例如"F:\\Backups"
或类似的),我如何检查文件系统是否支持硬链接?
如果失败了,有没有一种方法可以检查特定目录所在的文件系统的类型? 我想可以拉出来然后解决它是否得到支持?
答案 0 :(得分:3)
我会用这种方式解决这个问题:复制文件有3种选择:
os.link
。在Windows上,您可以使用以下功能:
def CreateHardLink(src, dst):
import ctypes
if not ctypes.windll.kernel32.CreateHardLinkA(dst, src, 0):
raise OSError
(免责声明:我没有测试过。想法是使用kernel32 API。)
shutil.copy2
)。然后,您可以使用临时文件(之后删除)在脚本开头测试这3个函数。成功的这3个函数中的第一个(即第一个不引用Exception
的函数)是制作实际备份副本的良好候选者。
这个想法遵循strategy pattern,你必须选择一个获取源文件名和目标文件名的函数,并尽最大努力按照你想要的方式进行复制。
让我再补充一点:检测文件系统以选择复制策略并不是一个很好的做法,就像检测浏览器不是在Javascript中做不同事情的好习惯一样。最好尝试使用某个功能,并准备捕获异常或处理错误,以便产生替代结果。