Go의 단일 디렉토리에 파일과 폴더를 간단히 나열하는 방법을 알아 내려고 노력했습니다.
나는 찾았 filepath.Walk
지만 자동으로 하위 디렉토리로 들어갑니다. 다른 모든 검색 결과가 더 좋아지지 않았습니다.
이 기능이 존재한다고 확신하지만 실제로 찾기가 어렵습니다. 내가 어디를보아야하는지 아는 사람이 있으면 알려주십시오. 감사.
답변
패키지 에서 ReadDir 함수를 사용해 볼 수 있습니다 io/ioutil
. 문서 당 :
ReadDir은 dirname으로 이름 지정된 디렉토리를 읽고 정렬 된 디렉토리 항목 목록을 리턴합니다.
결과 슬라이스에는 여기에os.FileInfo
나열된 방법을 제공하는 유형이 포함 됩니다 . 다음은 현재 디렉토리의 모든 이름을 나열하는 기본 예입니다 (폴더는 포함되어 있지만 특별히 표시되지는 않았습니다. IsDir()
방법 을 사용하여 항목이 폴더인지 확인할 수 있습니다 ).
package main
import (
"fmt"
"io/ioutil"
"log"
)
func main() {
files, err := ioutil.ReadDir("./")
if err != nil {
log.Fatal(err)
}
for _, f := range files {
fmt.Println(f.Name())
}
}
답변
더 간단하고 사용하십시오 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
}
답변
다양한 golang 표준 라이브러리 함수를 사용하여 파일 시스템의 폴더 안에있는 파일 목록을 얻을 수 있습니다.
- filepath.Walk
- ioutil.ReadDir
- os.File.Readdir
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
)
func main() {
var (
root string
files []string
err error
)
root := "/home/manigandan/golang/samples"
// filepath.Walk
files, err = FilePathWalkDir(root)
if err != nil {
panic(err)
}
// ioutil.ReadDir
files, err = IOReadDir(root)
if err != nil {
panic(err)
}
//os.File.Readdir
files, err = OSReadDir(root)
if err != nil {
panic(err)
}
for _, file := range files {
fmt.Println(file)
}
}
- filepath.Walk 사용
path/filepath
패키지는 자동으로 디렉토리의 각 하위 디렉토리를 검색하는 디렉토리에있는 모든 파일을 검사 할 수있는 편리한 방법을 제공합니다.
func FilePathWalkDir(root string) ([]string, error) {
var files []string
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
files = append(files, path)
}
return nil
})
return files, err
}
- ioutil.ReadDir 사용
ioutil.ReadDir
dirname으로 이름이 지정된 디렉토리를 읽고 filename별로 정렬 된 디렉토리 항목 목록을 리턴합니다.
func IOReadDir(root string) ([]string, error) {
var files []string
fileInfo, err := ioutil.ReadDir(root)
if err != nil {
return files, err
}
for _, file := range fileInfo {
files = append(files, file.Name())
}
return files, nil
}
- os.File.Readdir 사용
Readdir은 파일과 연관된 디렉토리의 내용을 읽고 Lstat에 의해 리턴되는 최대 n 개의 FileInfo 값의 슬라이스를 디렉토리 순서로 리턴합니다. 동일한 파일에 대한 후속 호출은 추가 FileInfo를 생성합니다.
func OSReadDir(root string) ([]string, error) {
var files []string
f, err := os.Open(root)
if err != nil {
return files, err
}
fileInfo, err := f.Readdir(-1)
f.Close()
if err != nil {
return files, err
}
for _, file := range fileInfo {
files = append(files, file.Name())
}
return files, nil
}
벤치 마크 결과.
이 블로그 게시물 에 대한 자세한 정보를 얻으십시오
답변
ioutil.ReadDir
좋은 발견이지만 소스를 클릭하고 보면 os.File의 Readdir 메소드를 호출하는 것을 볼 수 있습니다 . 디렉토리 순서에 문제가없고 정렬 된 목록이 필요하지 않은 경우이 Readdir 메소드 만 있으면됩니다.
답변
설명에서 아마도 원하는 것은 os.Readdirnames 입니다.
func (f *File) Readdirnames(n int) (names []string, err error)
Readdirnames는 파일과 연관된 디렉토리의 내용을 읽고 디렉토리에있는 디렉토리에서 최대 n 개의 파일 이름 슬라이스를 리턴합니다. 동일한 파일에 대한 후속 호출은 추가 이름을 생성합니다.
…
n <= 0 인 경우 Readdirnames는 디렉토리의 모든 이름을 단일 슬라이스로 반환합니다.
단편:
file, err := os.Open(path)
if err != nil {
return err
}
names, err := file.Readdirnames(0)
if err != nil {
return err
}
fmt.Println(names)
SquattingSlavInTracksuit 의 의견에 대한 크레딧 ; 가능하다면 답변에 댓글을 올리는 것이 좋습니다.