/
Praxis/

Инвентаризация: Составление списка всех файлов

Контекст

Прежде чем сравнивать и синхронизировать, нам нужно научиться видеть, что находится внутри директории. На этом первом этапе мы создадим утилиту, которая проведёт "инвентаризацию": заглянет в указанную папку и составит полный список всех файлов, включая те, что спрятаны глубоко во вложенных папках.

Ключевая концепция: Рекурсивный обход файловой системы

Представьте, что вы — инспектор, которому поручили составить опись всего имущества в большом офисном здании. Вы начинаете с главного входа, заходите на каждый этаж, открываете каждую дверь, заглядываете в каждый кабинет — это рекурсивный обход.

— функция, которая систематически проверяет каждый файл и папку внутри директории.

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)

    Логика:

    1. Вызвать filepath.WalkDir для обхода директории
    2. Для каждого элемента проверить d.IsDir() — пропустить директории
    3. Вычислить относительный путь через filepath.Rel
    4. Собрать пути в слайс и вернуть
  • В main():

    1. Получить путь из os.Args[1]
    2. Вызвать ListFiles
    3. Вывести каждый путь на новой строке

Пример работы

test-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

Полезные материалы

  • filepath.WalkDir — документация
  • Command Line Arguments — Go by Example
  • fs.DirEntry — интерфейс элемента директории
  • Работа с файлами — на русском

Критерии

не проверялось
  • Функция ListFiles(rootPath string) ([]string, error) создана
  • Используется filepath.WalkDir для обхода директории
  • Директории отфильтровываются через d.IsDir()
  • Возвращаются относительные пути через filepath.Rel
  • Ошибки от WalkDir проверяются и возвращаются
Войдите в аккаунт, чтобы начать проект
Запустите первую проверку