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
}
// An FS provides access to a hierarchical file system.
//
// The FS interface is the minimum implementation required of the file system.
// A file system may implement additional interfaces,
// such as fsutil.ReadFileFS, to provide additional or optimized functionality.
// See io/fsutil for details.
type FS interface {
// Open opens the named file.
//
// When Open returns an error, it should be of type *PathError
// with the Op field set to "open", the Path field set to name,
// and the Err field describing the problem.
//
// Open should reject attempts to open names that do not satisfy
// ValidPath(name), returning a *PathError with Err set to
// ErrInvalid or ErrNotExist.
Open(name string) (File, error)
}
// ReadDir reads the contents of the directory associated with the file f
// and returns a slice of DirEntry values in directory order.
// Subsequent calls on the same file will yield later DirEntry records in the directory.
//
// If n > 0, ReadDir returns at most n DirEntry records.
// In this case, if ReadDir returns an empty slice, it will return an error explaining why.
// At the end of a directory, the error is io.EOF.
//
// If n <= 0, ReadDir returns all the DirEntry records remaining in the directory.
// When it succeeds, it returns a nil error (not io.EOF).
func (f *File) ReadDir(n int) ([]DirEntry, error)
// A DirEntry is an entry read from a directory (using the ReadDir method).
type DirEntry interface {
// Name returns the name of the file (or subdirectory) described by the entry.
// This name is only the final element of the path, not the entire path.
// For example, Name would return "hello.go" not "/home/gopher/hello.go".
Name() string
// IsDir reports whether the entry describes a subdirectory.
IsDir() bool
// Type returns the type bits for the entry.
// The type bits are a subset of the usual FileMode bits, those returned by the FileMode.Type method.
Type() os.FileMode
// Info returns the FileInfo for the file or subdirectory described by the entry.
// The returned FileInfo may be from the time of the original directory read
// or from the time of the call to Info. If the file has been removed or renamed
// since the directory read, Info may return an error satisfying errors.Is(err, ErrNotExist).
// If the entry denotes a symbolic link, Info reports the information about the link itself,
// not the link's target.
Info() (FileInfo, error)
}
7条答案
按热度按时间r9f1avp51#
您可以尝试使用
os
包中的ReadDir函数。ReadDir读取指定的目录,返回按文件名排序的所有目录条目。
生成的切片包含
os.DirEntry
类型,它提供了下面列出的方法。下面是一个基本示例,列出了当前目录中所有内容的名称(文件夹也包括在内,但没有特别标记--您可以使用IsDir()
方法检查一个项目是否是文件夹):hs1ihplo2#
我们可以使用各种golang标准库函数来获取文件系统中某个文件夹内的文件列表。
1.* * 文件路径.漫游**
1.* * 外部读取目录**
1.* * 操作系统文件读取器**
1.* * 使用文件路径. Walk**
path/filepath
软件包提供了一个扫描目录中所有文件的便捷方法,它会自动扫描目录中的每个子目录。1.* * 使用ioutil.读取目录**
ioutil.ReadDir
读取由dirname命名的目录,并返回按filename排序的目录条目列表。1.* * 正在使用os. File.读取器**
Readdir读取与file关联的目录的内容,并返回一个最多包含n个FileInfo值的切片,就像Lstat返回的那样,按目录顺序。对同一文件的后续调用将产生更多的FileInfo。
基准结果。
获取有关此Blog Post的更多详细信息
pcrecxhr3#
更简单的方法是使用
path/filepath
:9jyewag04#
从Go语言1.16开始,你可以使用os.ReadDir函数。
func ReadDir(name string) ([]DirEntry, error)
它读取给定的目录并返回一个
DirEntry
切片,其中包含按文件名排序的目录条目。这是一个乐观函数,因此,当读取目录条目时发生错误时,它会尝试返回一个切片,其中的文件名直到错误发生之前。
关注:Go 1.17(2021年第三季度)包括
fs.FileInfoToDirEntry()
:FileInfoToDirEntry
返回一个DirEntry
,它返回来自info
的信息。如果
info
为nil,则FileInfoToDirEntry
返回nil。背景
Go 1.16(2021年第一季度)将提出CL 243908和CL 243914,以及基于
FS
interface的ReadDir
function:这允许"os: add
ReadDir
method for lightweight directory reading":参见commit a4ede9f:
src/os/os_test.go#testReadDir()
说明了它的用法:Ben Hoyt在Go语言1.16
os.ReadDir
的注解中指出:os.ReadDir(path string) ([]os.DirEntry, error)
,您可以直接调用它,而无需使用Open
舞蹈。所以你可以把它缩短为
os.ReadDir
,因为这是大多数人都会调用的具体函数。参见commit 3d913a9(2020年12月):
os
:从io/ioutil
添加ReadFile
、WriteFile
、CreateTemp
(以前是TempFile
)、MkdirTemp
(以前是TempDir
io/ioutil
是一个定义不明确的助手集合。Proposal #40025将通用I/O helper移到io。proposal #42026的此CL将特定于操作系统的helper移到
os
,使整个io/ioutil
包弃用。与
ioutil.ReadDir
的[]FileInfo
相反,os.ReadDir
返回[]DirEntry
。(提供返回
[]DirEntry
的帮助器是此更改的主要动机之一。)yrefmtwq5#
ioutil.ReadDir
是一个很好的发现,但是如果您单击并查看源代码,您会看到它调用os.File的方法Readdir。如果您对目录顺序没有问题,并且不需要对列表进行排序,那么这个Readdir方法就是您所需要的全部。os8fio9y6#
从您的描述来看,您可能需要的是os.Readidrnames。
func (f *File) Readdirnames(n int) (names []string, err error)
读取与文件关联的目录的内容,并返回目录中最多n个文件名的切片,按目录顺序。对同一文件的后续调用将产生更多的文件名。
...
如果n〈= 0,则Redddirnames在单个切片中返回目录中的所有名称。
片段:
归功于SquattingSlavInTracksuit的评论;如果可以的话,我会建议把他们的评论提升为答案。
q0qdq0h27#
使用
Readdirnames
递归打印目录中所有文件的完整示例