尝试记录以下值path
vs. fullPath
代替walkFn
.
Using filepath.Abs()
代替walkFn
没有给出您想要的结果:它正在解析相对于当前工作目录的文件名,而不是原始的 dirPath。
一种选择是将目标目录解析为预先的绝对路径doHashWalk
:
func doHashWalk(dirPath string) {
fullPath, err := filepath.Abs(dirPath)
if err != nil {
log.Println("path error:", err)
return
}
err = filepath.Walk(fullPath, walkFn)
// check err here
}
随着这一变化,walkFn
回调将始终收到完全限定的path
争论;无需打电话filepath.Abs()
again:
func walkFn(path string, fi os.FileInfo, err error) (e error) {
// ...
bytes, err := ioutil.ReadFile(path)
// ...
}
如果您的应用程序了解每个文件相对于原始文件的路径很重要dirPath
root,你可以将该路径潜入walkFn
通过闭包回调:
func doHashWalk(dirPath string) error {
fullPath, err := filepath.Abs(dirPath)
if err != nil {
return err
}
callback := func(path string, fi os.FileInfo, err error) error {
return hashFile(fullPath, path, fi, err)
}
return filepath.Walk(fullPath, callback)
}
func hashFile(root string, path string, fi os.FileInfo, err error) error {
if fi.IsDir() {
return nil
}
rel, err := filepath.Rel(root, path)
if err != nil {
return err
}
log.Println("hash rel:", rel, "abs:", path)
return nil
}