2015-07-30 3 views
0

I имеют следующую структуру:Go - Перебрать directores/файлов в текущем каталоге

project/ 
    docs/ 
     index.html 
    root.html 

Я пытаюсь перебирать эту структуру проекта, так что я могу прочитать содержимое каждого файла для их обработки. Поэтому я хочу сказать «поиск по проекту каталога», затем он будет искать по всем файлам и только первый уровень каталогов и их файлы, поэтому, если бы был другой каталог с файлом внутри docs/, он бы игнорируй это.

В настоящее время, я пытался сделать это с «путь/Filepath» Библиотека:

func traverse(path string, file os.FileInfo, err error) error { 
    if file, err := os.Open(file.Name()); err == nil { 
     defer file.Close() 
     if fileStat, err := file.Stat(); err == nil { 
      switch mode := fileStat.Mode(); { 
      case mode.IsDir(): 
       fmt.Println("it be a directory! lets traverse", file.Name()) 
       filepath.Walk(file.Name(), traverse) 
      case mode.IsRegular(): 
       fmt.Println("the thingy ", file.Name(), " is a file") 
      } 
     } else { 
      return errors.New("failed to check status") 
     } 
    } 
    return errors.New("failed 2 open file/dir?") 
} 

Тогда я назвал его здесь:

if err := filepath.Walk("project/", traverse); err != nil { 
    setupErr("%s", err) 
} 

Следует заметить, что я бегу этот исполняемый относительно в мой тестовый каталог, так что он находит директорию в порядке. Моя проблема заключается в самом деле, когда я бег, я получаю следующее:

it be a directory! lets traverse project 
it be a directory! lets traverse project 
#^printed about 20 more times^
failed 2 open file/dir? 

Я думаю, что моя рекурсия поодаль, и он не меняется в каталог возможно? Любые идеи, если вам нужна дополнительная информация, просто спросите, и я обновлю.

ответ

1

Во-первых, похоже, что вы хотите, чтобы это противоречило коду, который у вас есть. Вы писали:

Поэтому я хочу сказать «поиск по проекту каталога», затем он будет искать все файлы и только первый уровень каталогов и их файлов, поэтому, если бы существовал другой каталог с файл внутри документов /, он будет игнорировать его.

Означает ли это, что вы хотите перебирать только два уровня каталогов (текущий и один ниже) и игнорировать остальные?

Если это так, вам не нужна рекурсия, простой цикл, который выполняет функцию поиска по файлам в текущем каталоге и для каждого его подкаталога.

Код, который вы просматриваете поддеревом каталога файловой системы.

В принципе, filepath.Walk, который вы используете, должен сделать это за вас. Таким образом, вы либо реализуете рекурсивную ходьбу, либо используете Walk, но не оба.

Во-вторых, рекурсия реализована неправильно в коде. Он пропускает итерацию по каталогам.

Таким образом, код, который печатает имена файлов в текущем каталоге и его подкаталогах (но не дальше) является:

package main 

import (
    "fmt" 
    "io/ioutil" 
) 

func main() { 
    items, _ := ioutil.ReadDir(".") 
    for _, item := range items { 
     if item.IsDir() { 
      subitems, _ := ioutil.ReadDir(item.Name()) 
      for _, subitem := range subitems { 
       if !subitem.IsDir() { 
        // handle file there 
        fmt.Println(item.Name() + "/" + subitem.Name()) 
       } 
      } 
     } else { 
      // handle file there 
      fmt.Println(item.Name()) 
     } 
    } 
} 
+0

Хм, ладно спасибо. И как я буду перебирать каталоги? Я немного новичок в Go. – chapman

+0

Вот он: http://play.golang.org/p/F7LwBgm8h3 –

+0

Фантастический, спасибо @AlexAtNet – chapman

0

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

Смежные вопросы