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で指定されたディレクトリを読み取り、ファイル名でソートされたディレクトリエントリのリストを返します。
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
ます。
あなたの説明から、おそらくあなたが望むのはos.Readdirnamesです。
func (f *File) Readdirnames(n int) (names []string, err error)
Readdirnamesは、ファイルに関連付けられたディレクトリの内容を読み取り、ディレクトリ内の最大n個のファイル名のスライスをディレクトリ順に返します。同じファイルを続けて呼び出すと、さらに名前が付けられます。
...
n <= 0の場合、Readdirnamesは1つのスライスのディレクトリからすべての名前を返します。
スニペット:
file, err := os.Open(path)
if err != nil {
return err
}
names, err := file.Readdirnames(0)
if err != nil {
return err
}
fmt.Println(names)
SquattingSlavInTracksuitのコメントのクレジット。可能であれば、回答へのコメントの昇格を提案しました。