背景
最近搞了一台NAS,使用了两只珍藏多年的500G组Raid1(废物利用),把积累多年的照片放了上去,发现有100G多,其中半数重复,经年累月备份的结果,于是想释放这些空间,能节省就节省。
老早前使用golang写过一个去重工具,过于久远,源码找不到了,就重新撸了一个,以后随时使用。
过程
1.定义文件信息结构
定义以下结构体保存读到的文件信息,并为后续文件处理提供方便。
// FileInfo 文件信息保存
type FileInfo struct {
FullPath string // 文件的全路径
Sha256 string // 文件的sha256值 用于文件排重
Size int64 // 文件的大小 单位字节
fullRead bool // 计算sha256时是否读取了文件的全部内容
}
FullPath 是文件的全路径名即绝对路径名,在确定是重复的文件时执行删除操作时用的到。
Sha256 是文件内容的sha256摘要,用于确定此文件与其他文件内容上是否相同,为了速度这里参与计算的文件内容并不是文件内容的全部,只是文件开头的一部分。这样不用读取全部,但存在问题,两个文件如果只有后部分不同则无法有效判断。我这里只有照片问题不大,但为了保险,还是做了相应处理。
Size 是文件的大小,单位字节,这也是判断文件内容是否一样的重要依据之一。
为了解决上述内容前部分相同的问题,添加了fullRead字段,用于指示在计算sha256时是否主动读取了全部文件,仅在