GOLANG: Fuss-Verzeichnis-Struktur und Prozess-Dateien — err = 'keine solche Datei oder Verzeichnis
Ich Schreibe eine routine, die zu Fuß ein Verzeichnis und erstellen Sie eine digitale Signatur (salted-hash) für jede Datei, die ich finde. Beim testen bekomme ich dieses komische Verhalten - wenn ich das Programm ein root-Pfad "oben" das Verzeichnis, das Programm kann zu Fuss den Baum und drucken Sie die Datei-Namen, aber wenn ich versuche, öffnen Sie die Datei, um es zu Lesen die bytes, bekomme ich die Fehlermeldung "no such file or directory" auf die Datei, die die Routinen gefunden, nicht sicher, was gibt es hier. Wie kann der Fuß () - routine "siehe" die Datei, aber ioutil.ReadFile() nicht in der Lage sein, es zu finden?
Beispielcode:
//start with path higher up the tree, say $HOME
func doHashWalk(dirPath string) {
err := filepath.Walk(dirPath, walkFn)
//Check err here
}
func walkFn(path string, fi os.FileInfo, err error) (e error) {
if !fi.IsDir() {
//if the first character is a ".", then skip it as it's a hidden file
if strings.HasPrefix(fi.Name(), ".") {
return nil
}
//read in the file bytes -> get the absolute path
fullPath, err := filepath.Abs(fi.Name())
if err != nil {
log.Printf("Abs Err: %s", err)
}
//THIS ALWAYS FAILED WITH ERROR
bytes, err := ioutil.ReadFile(fullPath) //<-- (fi.Name() also doesn't work)
if err != nil {
log.Printf("Err: %s, Bytes: %d", err, len(bytes))
}
//create the salted hash
...
}
return nil
}
- Die kurze Antwort ist, dass
fi.Name()
stellt nur den Namen der Datei, nicht den Pfad. Verwendenpath
für Ihre abs-Aufruf enthält sowohl die dirname und basename der Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen die Protokollierung der Werte der
path
vs.fullPath
innerhalb vonwalkFn
.Mit
filepath.Abs()
innerhalb vonwalkFn
nicht das Ergebnis geben, das Sie wollen: es ist das auflösen der Dateinamen relativ zum aktuellen Arbeitsverzeichnis, statt der ursprünglichen dirPath.Ist eine option, zu beheben, wird das Ziel-directory einen absoluten Pfad up-front in
doHashWalk
:Mit dieser änderung, die
walkFn
Rückruf erhalten immer eine voll qualifiziertepath
argument; keine Notwendigkeit, rufen Siefilepath.Abs()
wieder:Wenn es für Ihre Anwendung wichtig, um den Pfad jeder Datei relativ zu der ursprünglichen
dirPath
Wurzel, Sie kann schleichen, der Weg in diewalkFn
callback über eine Schließung:Der Probleme ist, dass Sie nicht mit der
filepath.Walk
genau so, wie es soll.Sie bereits der Pfad zu der Datei, aus der
path
parameter.Den docs vielleicht nicht genau klar sein, aber Sie sagen, dass dies für den Dateipfad.Zu Fuss:
So könnte man verkürzen
walkFn
etwas wie dies:Fuß kümmern sich nicht zu Fuß den Datei-Baum über
..
es gibt keine Notwendigkeit für Sie, um zu überprüfen, dass. Bedenkt man den absoluten Pfad Teil habe ich nicht wirklich denken, Sie brauchen, dass entweder, aber ich mache keine Versprechungen 😉