Прежде чем сравнивать и синхронизировать, нам нужно научиться видеть, что находится внутри директории. На этом первом этапе мы создадим утилиту, которая проведёт "инвентаризацию": заглянет в указанную папку и составит полный список всех файлов, включая те, что спрятаны глубоко во вложенных папках.
Представьте, что вы — инспектор, которому поручили составить опись всего имущества в большом офисном здании. Вы начинаете с главного входа, заходите на каждый этаж, открываете каждую дверь, заглядываете в каждый кабинет — это рекурсивный обход.
— функция, которая систематически проверяет каждый файл и папку внутри директории.
filepath.WalkDir(rootPath, func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if !d.IsDir() { // path — это путь к файлу fmt.Println(path) } return nil })
💡 Gotcha:
WalkDirпередаёт пути с префиксомrootPath. Если вызватьWalkDir("./data", ...), путь будет./data/file.txt, а неfile.txt. Используйтеfilepath.Rel(rootPath, path)для получения относительных путей.
| Пакет | Назначение | Ключевые функции |
|---|---|---|
path/filepath | Работа с путями | WalkDir, Rel |
io/fs | Интерфейсы файловой системы | DirEntry, IsDir |
os | Базовые операции | Args |
Создать утилиту для рекурсивного сканирования директории.
Что необходимо сделать:
Функция:
func ListFiles(rootPath string) ([]string, error)
Логика:
filepath.WalkDir для обхода директорииd.IsDir() — пропустить директорииfilepath.RelВ main():
os.Args[1]ListFilestest-data/
├── report.docx
├── photos/
│ ├── image1.jpg
│ └── image2.png
└── archive.zip
$ go run main.go ./test-data report.docx photos/image1.jpg photos/image2.png archive.zip
ListFiles(rootPath string) ([]string, error) созданаfilepath.WalkDir для обхода директорииd.IsDir()filepath.RelWalkDir проверяются и возвращаются