Go의 디렉토리 목록


197

Go의 단일 디렉토리에 파일과 폴더를 간단히 나열하는 방법을 알아 내려고 노력했습니다.

나는 찾았 filepath.Walk지만 자동으로 하위 디렉토리로 들어갑니다. 다른 모든 검색 결과가 더 좋아지지 않았습니다.

이 기능이 존재한다고 확신하지만 실제로 찾기가 어렵습니다. 내가 어디를보아야하는지 아는 사람이 있으면 알려주십시오. 감사.

답변:


359

패키지 에서 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())
    }
}

7
당신은 단지 원하는 경우 이름 디렉토리와 속도의 내용을 사용하는 것으로, 본질주의입니다 Readdirnames 것은 입니다 크기 순서 (나를 위해 약 20 배 빠른) 속도
SquattingSlavInTracksuit

2
@SquattingSlavInTracksuit : 당시 댓글 권한이 없기 때문에 귀하의 의견을 답변으로 승격했습니다. 대답을하고 신용을 얻으려면 LMK.
Jacob Kopczynski

2
@SquattingSlavInTracksuit-그것은 단지 한 자릿수입니다 : P
nadavvadan

78

더 간단하고 사용하십시오 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
}

8
참고Glob ignores file system errors such as I/O errors reading directories. The only possible returned error is ErrBadPattern, when pattern is malformed.

3
사용하기 전에 Glob의 기능을 이해해야합니다. golang.org/pkg/path/filepath/#Glob
Anfernee

66

다양한 golang 표준 라이브러리 함수를 사용하여 파일 시스템의 폴더 안에있는 파일 목록을 얻을 수 있습니다.

  1. filepath.Walk
  2. ioutil.ReadDir
  3. 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)
    }
}
  1. 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
}
  1. 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
}
  1. 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
}

벤치 마크 결과.

벤치 마크 점수

블로그 게시물 에 대한 자세한 정보를 얻으십시오


3
가장 완벽한 답변은 여기입니다. 이 벤치 마크에서보고 한 메모리 사용량이나 할당량이 없다는 점은 주목할 가치가 있습니다. 구현이 빠를수록 더 많은 메모리를 사용할 수 있습니다. 또한 테스터 컴퓨터의 CPU 코어 수가 동시에 피해를 입히거나 도움을 줄 수 filepath.Walk있습니다. 또한, filepath.Walk지원은 괜찮은 동안 재귀 os.File.Readdirioutil.ReadDir하지 않습니다.
Xeoncross

24

ioutil.ReadDir좋은 발견이지만 소스를 클릭하고 보면 os.File의 Readdir 메소드를 호출하는 것을 볼 수 있습니다 . 디렉토리 순서에 문제가없고 정렬 된 목록이 필요하지 않은 경우이 Readdir 메소드 만 있으면됩니다.


7

설명에서 아마도 원하는 것은 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의견에 대한 크레딧 ; 가능하다면 답변에 댓글을 올리는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.