如何执行文件系统扫描

新手上路,请多包涵
  1. 我需要编写一个函数,当给定一个文件夹的路径时,它会扫描以该文件夹为根的文件。
  2. 然后我需要显示该文件夹的目录结构。

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

原文由 chinmay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

编辑 1.16 :仍然有足够多的人回答这个答案,我想我会为 Go 1.16 更新它。

Go 1.16 中引入的函数 filepath.WalkDir 比之前编辑中提到的 filepath.Walk 具有更好的性能。这是一个工作示例:

 package main

import (
    "flag"
    "fmt"
    "io/fs"
    "path/filepath"
)

func visit(path string, di fs.DirEntry, err error) error {
    fmt.Printf("Visited: %s\n", path)
    return nil
}

func main() {
    flag.Parse()
    root := flag.Arg(0)
    err := filepath.WalkDir(root, visit)
    fmt.Printf("filepath.WalkDir() returned %v\n", err)
}

编辑:仍然有足够多的人回答这个问题,我想我会为 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)
}

请注意 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>

原始答案如下: 自 weekly.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)
}

原文由 laslowh 发布,翻译遵循 CC BY-SA 4.0 许可协议

下面是获取目录中文件的文件信息的方法。

 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")
        }
    }
}

原文由 peterSO 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题