douxi8759 2011-07-07 10:05
浏览 93
已采纳

如何在Golang中执行文件系统扫描?

  1. I need to write a function which when given the path of a folder scans the files rooted at that folder.
  2. And then I need to display the directory structure at that folder.

I know how to do 2 (I am going to use jstree to display it in the browser).

Please help me with part 1, like what/where to start to write such a function in go.

  • 写回答

6条回答 默认 最新

  • dongtuo5611 2011-07-07 14:29
    关注

    EDIT: Enough people still hit this answer, that I thought I'd update it for the Go1 API. This is a working example of filepath.Walk(). The original is below.

    package main
    
    import (
      "path/filepath"
      "os"
      "flag"
      "fmt"
    )
    
    func visit(path string, f os.FileInfo, err error) error {
      fmt.Printf("Visited: %s
    ", path)
      return nil
    } 
    
    
    func main() {
      flag.Parse()
      root := flag.Arg(0)
      err := filepath.Walk(root, visit)
      fmt.Printf("filepath.Walk() returned %v
    ", err)
    }
    

    Please note that filepath.Walk walks the directory tree recursively.

    This is an example run:

    $ mkdir -p dir1/dir2
    $ touch dir1/file1 dir1/dir2/file2
    $ go run walk.go dir1
    Visited: dir1
    Visited: dir1/dir2
    Visited: dir1/dir2/file2
    Visited: dir1/file1
    filepath.Walk() returned <nil>
    

    ORIGINAL ANSWER FOLLOWS: The interface for walking file paths has changed as of weekly.2011-09-16, see http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218. The code below will not work for release versions of GO in the near future.

    There's actually a function in the standard lib just for this: filepath.Walk.

    package main
    
    import (
        "path/filepath"
        "os"
        "flag"
    )
    
    type visitor int
    
    // THIS CODE NO LONGER WORKS, PLEASE SEE ABOVE
    func (v visitor) VisitDir(path string, f *os.FileInfo) bool {
        println(path)
        return true
    } 
    
    func (v visitor) VisitFile(path string, f *os.FileInfo) {
        println(path)
    }
    
    func main() {
        root := flag.Arg(0)
        filepath.Walk(root, visitor(0), nil)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?