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

chi*_*may 98 directory file go

  1. 我需要编写一个函数,当给定文件夹的路径时,它会扫描以该文件夹为根的文件.
  2. 然后我需要在该文件夹中显示目录结构.

我知道怎么做2(我将使用jstree在浏览器中显示它).

请帮我解决第1部分,比如在什么/哪里开始编写这样的函数.

las*_*owh 189

编辑:足够的人仍然听到这个答案,我以为我会为Go1 API更新它.这是filepath.Walk()的一个工作示例.原文如下.

package main

import (
  "path/filepath"
  "os"
  "flag"
  "fmt"
)

func visit(path string, f os.FileInfo, err error) error {
  fmt.Printf("Visited: %s\n", path)
  return nil
} 


func main() {
  flag.Parse()
  root := flag.Arg(0)
  err := filepath.Walk(root, visit)
  fmt.Printf("filepath.Walk() returned %v\n", err)
}
Run Code Online (Sandbox Code Playgroud)

请注意,filepath.Walk以递归方式遍历目录树.

这是一个示例运行:

$ 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>
Run Code Online (Sandbox Code Playgroud)

原始答案后续:步行文件路径的界面已于每周更新.2011-09-16,请参阅http://groups.google.com/group/golang-nuts/msg/e304dd9cf196a218.以下代码在不久的将来不适用于GO的发行版本.

标准库中实际上只有一个函数: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)
}
Run Code Online (Sandbox Code Playgroud)

  • @FrancescoPasa`filepath.Walk`回调将在符号链接(文件和目录)上触发.是的,它不会_follow_他们,但回调识别一个符号链接并采取进一步的行动,即后续`filepath.Walk`确保首先没有访问该路径. (3认同)

pet*_*rSO 15

这是获取目录中文件的文件信息的一种方法.

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    dirname := "." + string(filepath.Separator)
    d, err := os.Open(dirname)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer d.Close()
    fi, err := d.Readdir(-1)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    for _, fi := range fi {
        if fi.Mode().IsRegular() {
            fmt.Println(fi.Name(), fi.Size(), "bytes")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Fra*_*ois 12

下面是一个循环遍历所有文件和目录的示例.请注意,如果您想知道您要追加的路径是否是目录,请选中"f.IsDir()".

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    searchDir := "c:/path/to/dir"

    fileList := []string{}
    err := filepath.Walk(searchDir, func(path string, f os.FileInfo, err error) error {
        fileList = append(fileList, path)
        return nil
    })

    for _, file := range fileList {
        fmt.Println(file)
    }
}
Run Code Online (Sandbox Code Playgroud)


Mos*_*afa 7

Package github.com/kr/fs提供了Walker一个非常有趣的API.