Go의 단일 디렉토리에 파일과 폴더를 간단히 나열하는 방법을 알아 내려고 노력했습니다.
나는 찾았 filepath.Walk
지만 자동으로 하위 디렉토리로 들어갑니다. 다른 모든 검색 결과가 더 좋아지지 않았습니다.
이 기능이 존재한다고 확신하지만 실제로 찾기가 어렵습니다. 내가 어디를보아야하는지 아는 사람이 있으면 알려주십시오. 감사.
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
}
Glob ignores file system errors such as I/O errors reading directories. The only possible returned error is ErrBadPattern, when pattern is malformed.
다양한 golang 표준 라이브러리 함수를 사용하여 파일 시스템의 폴더 안에있는 파일 목록을 얻을 수 있습니다.
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)
}
}
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
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
}
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
}
벤치 마크 결과.
이 블로그 게시물 에 대한 자세한 정보를 얻으십시오
filepath.Walk
있습니다. 또한, filepath.Walk
지원은 괜찮은 동안 재귀 os.File.Readdir
와 ioutil.ReadDir
하지 않습니다.
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 의 의견에 대한 크레딧 ; 가능하다면 답변에 댓글을 올리는 것이 좋습니다.