2024-07-20 06:00:00

在Go中列出目录

我一直在尝试如何在Go中简单地列出单个目录中的文件和文件夹。

我找到文件路径了。Walk,但它会自动进入子目录,这是我不想要的。我其他的搜索都没有更好的结果。

我相信这个功能是存在的,但它真的很难找到。如果有人知道我该去哪里找,请告诉我。谢谢。


当前回答

从您的描述中,您可能需要的是os.Readdirnames。

func (f *File) Readdirnames(n int) (names[]字符串,err错误) Readdirnames读取与file相关的目录的内容,并按目录顺序返回该目录中最多n个文件名的切片。对同一文件的后续调用将产生更多的名称。 ... 如果n <= 0, Readdirnames在一个切片中返回目录中的所有名称。

代码片段:

file, err := os.Open(path)
if err != nil {
    return err
}
defer file.Close()
names, err := file.Readdirnames(0)
if err != nil {
    return err
}
fmt.Println(names)

归功于SquattingSlavInTracksuit的评论;如果可以的话,我会建议将他们的评论提升为一个答案。

其他回答

您可以尝试使用操作系统包中的ReadDir功能。根据文档:

ReadDir读取已命名的目录,返回按文件名排序的所有目录条目。

生成的切片包含os。DirEntry类型,它们提供了这里列出的方法。下面是一个基本的例子,列出了当前目录中所有东西的名称(包含文件夹,但没有特别标记-你可以使用IsDir()方法检查一个项目是否为文件夹):

package main

import (
    "fmt"
    "os"
     "log"
)

func main() {
    entries, err := os.ReadDir("./")
    if err != nil {
        log.Fatal(err)
    }
 
    for _, e := range entries {
            fmt.Println(e.Name())
    }
}

使用Readdirnames递归打印目录中所有文件的完整示例

package main

import (
    "fmt"
    "os"
)

func main() {
    path := "/path/to/your/directory"
    err := readDir(path)
    if err != nil {
        panic(err)
    }
}

func readDir(path string) error {
    file, err := os.Open(path)
    if err != nil {
        return err
    }
    defer file.Close()
    names, _ := file.Readdirnames(0)
    for _, name := range names {
        filePath := fmt.Sprintf("%v/%v", path, name)
        file, err := os.Open(filePath)
        if err != nil {
            return err
        }
        defer file.Close()
        fileInfo, err := file.Stat()
        if err != nil {
            return err
        }
        fmt.Println(filePath)
        if fileInfo.IsDir() {
            readDir(filePath)
        }
    }
    return nil
}

ioutil。ReadDir是一个很好的发现,但是如果你点击并查看源代码,你会看到它调用os.File的ReadDir方法。如果您对目录顺序没有问题,并且不需要对列表排序,那么这个Readdir方法就是您所需要的全部。

更简单的是,使用path/filepath:

package main    

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

func main() {
    files, err := filepath.Glob("*")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(files) // contains a list of all files in the current directory
}

从您的描述中,您可能需要的是os.Readdirnames。

func (f *File) Readdirnames(n int) (names[]字符串,err错误) Readdirnames读取与file相关的目录的内容,并按目录顺序返回该目录中最多n个文件名的切片。对同一文件的后续调用将产生更多的名称。 ... 如果n <= 0, Readdirnames在一个切片中返回目录中的所有名称。

代码片段:

file, err := os.Open(path)
if err != nil {
    return err
}
defer file.Close()
names, err := file.Readdirnames(0)
if err != nil {
    return err
}
fmt.Println(names)

归功于SquattingSlavInTracksuit的评论;如果可以的话,我会建议将他们的评论提升为一个答案。