- Мне нужно написать функцию, которая при задании пути к папке сканирует файлы с корнем в этой папке.
- Затем мне нужно отобразить структуру каталогов в этой папке.
Я знаю, как сделать 2 (я собираюсь использовать jstree, чтобы отобразить его в браузере).
Ответы:
РЕДАКТИРОВАТЬ : достаточное количество людей все еще находят этот ответ, и я подумал, что обновлю его для API Go1. Это рабочий пример filepath.Walk () . Оригинал ниже.
Обратите внимание, что filepath.Walk рекурсивно просматривает дерево каталогов.
Это пример запуска:
ОРИГИНАЛЬНЫЙ ОТВЕТ СЛЕДУЮЩИЙ: Интерфейс для путей ходьбы файлов изменились по состоянию на weekly.2011-09-16 см http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218 . Приведенный ниже код не будет работать для релизных версий GO в ближайшем будущем.
На самом деле для этого в стандартной библиотеке есть функция: filepath.Walk .
источник
filepath.Walk
кстати, не следует символическим ссылкам.filepath.Walk
вызов @FrancescoPasa будет запускаться для символических ссылок (как файлов, так и каталога). Да, он не будет следовать за ними, но обратный вызов распознает символическую ссылку и предпримет дальнейшие действия, например, последующие действия,filepath.Walk
гарантирующие, что путь еще не был посещен.Вот способ получить информацию о файлах в каталоге.
источник
Readdir
параметр метода -n
это файлint
. Еслиn <= 0
,Readdir
возвращает всеFileInfo
из каталога в одном фрагменте.os
func (FileMode) IsRegular
.Вот пример рекурсивного перебора всех файлов и каталогов. Обратите внимание: если вы хотите знать, является ли добавляемый путь каталогом, просто отметьте «f.IsDir ()».
источник
main
метода не должно быть([]string, error)
аргументов, и вам нужно что-то делать сerr
. Разве на момент ответа он был действителен? Определенно ошибка компиляции в более поздних версиях. В остальном очень полезно, спасибо.Пакет
github.com/kr/fs
предоставляетWalker
очень интересный API.источник
Стандартный пакет Go
ioutil
имеет встроенную функцию для этого сценария, см. Пример нижеисточник
Обратите внимание, что «Walk не следует по символическим ссылкам», поэтому, если вы хотите написать функцию, которая делает это, я рекомендую ioutil.ReadDir . Мой собственный тест показал, что он быстрее и потребляет меньше памяти, чем filepath.Glob .
Кроме того,
ioutil.ReadDir
файлы сортируются по базовому имени с помощью простого сравнения строк (strA > strB
). Как парень DevOps, я обычно сортирую имена каталогов, выполняя обратное числовое сравнение (например, сначала последняя сборка). Если это также ваш случай, то лучше вызвать os.ReadDir напрямую (ioutil.ReadDir
вызывает это из-под обложек) и выполнить сортировку самостоятельно.Вот пример
ReadDir
детали с числовой сортировкой:источник
Возможно, вы захотите выполнить каррирование функций здесь, чтобы вы могли полностью использовать поиск
источник