- Ich muss eine Funktion schreiben, die, wenn der Pfad eines Ordners angegeben wird, die in diesem Ordner verwurzelten Dateien scannt.
- Und dann muss ich die Verzeichnisstruktur in diesem Ordner anzeigen.
Ich weiß, wie man 2 macht (ich werde jstree verwenden, um es im Browser anzuzeigen).
Antworten:
EDIT : Genug Leute haben diese Antwort noch getroffen, dass ich dachte, ich würde sie für die Go1-API aktualisieren. Dies ist ein funktionierendes Beispiel für filepath.Walk () . Das Original ist unten.
Bitte beachten Sie, dass filepath.Walk den Verzeichnisbaum rekursiv durchläuft.
Dies ist ein Beispiellauf:
ORIGINAL ANTWORT FOLGT: Die Benutzeroberfläche für das Gehen von Dateipfaden hat sich seit dem wöchentlichen 2011-09-16 geändert, siehe http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218 . Der folgende Code wird in naher Zukunft nicht für Release-Versionen von GO funktionieren.
Es gibt tatsächlich eine Funktion in der Standardbibliothek, nur dafür: filepath.Walk .
quelle
filepath.Walk
folgt übrigens keinen Symlinks.filepath.Walk
Rückruf wird über Symlinks (sowohl Datei als auch Verzeichnis) ausgelöst. Ja, es wird ihnen nicht folgen , aber der Rückruf erkennt einen Symlink und ergreift weitere Maßnahmen, dh eine Nachverfolgung,filepath.Walk
die zunächst sicherstellt, dass der Pfad noch nicht besucht wurde.Hier finden Sie eine Möglichkeit, Dateiinformationen für die Dateien in einem Verzeichnis abzurufen.
quelle
Readdir
Methodenparametern
einint
. Wennn <= 0
,Readdir
gibt alleFileInfo
aus dem Verzeichnis in einem einzigen Slice zurück.os
func (FileMode) IsRegular
.Hier ist ein Beispiel, um alle Dateien und Verzeichnisse rekursiv zu durchlaufen. Wenn Sie wissen möchten, ob der angehängte Pfad ein Verzeichnis ist, aktivieren Sie einfach "f.IsDir ()".
quelle
main
Methode sollte keine([]string, error)
Argumente enthalten und Sie müssen etwas damit tunerr
. Es sei denn, zum Zeitpunkt der Beantwortung war es gültig? Auf jeden Fall ein Kompilierungsfehler in neueren Versionen. Ansonsten sehr nützlich, danke.Paket
github.com/kr/fs
bietetWalker
eine sehr interessante API.quelle
Das Go-Standardpaket
ioutil
verfügt über eine integrierte Funktion für dieses Fallszenario (siehe Beispiel unten)quelle
Beachten Sie, dass "Walk nicht symbolischen Links folgt". Wenn Sie also eine Funktion schreiben möchten , die dies tut, empfehle ich ioutil.ReadDir . Mein eigener Benchmark-Test hat gezeigt, dass er schneller und weniger speicherintensiv ist als filepath.Glob .
Darüber hinaus werden
ioutil.ReadDir
Dateien mithilfe des grundlegenden Zeichenfolgenvergleichs (strA > strB
) nach Basisnamen sortiert . Als Entwickler sortiere ich Dir-Namen im Allgemeinen durch einen umgekehrten numerischen Vergleich (zum Beispiel den neuesten Build zuerst). Wenn dies auch Ihr Fall ist, ist es besser, os.ReadDir direkt aufzurufen (ioutil.ReadDir
ruft dies unter der Decke auf) und die Sortierung selbst durchzuführen .Hier ist ein Beispiel für den
ReadDir
Teil mit numerischer Sortierung:quelle
Möglicherweise möchten Sie hier Funktionscurrying durchführen, damit Sie die Suche vollständig nutzen können
quelle