go

Directorio de lista en Go



(4)

He estado tratando de encontrar la manera de simplemente enumerar los archivos y las carpetas en un único directorio en Ir.

Encontré filepath.Walk , pero va a los subdirectorios automáticamente, lo que no quiero. Todas mis otras búsquedas no han mejorado nada.

Estoy seguro de que esta funcionalidad existe, pero ha sido muy difícil de encontrar. Avísame si alguien sabe dónde debería mirar. Gracias.


Aún más simple, use 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 }


Podemos obtener una lista de archivos dentro de una carpeta en el sistema de archivos usando varias funciones de la biblioteca estándar de 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. Usando filepath.Walk

El paquete path/filepath proporciona una forma práctica de escanear todos los archivos en un directorio, automáticamente escaneará cada subdirectorio en el directorio.

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. Usando ioutil.ReadDir

ioutil.ReadDir lee el directorio nombrado por dirname y devuelve una lista de entradas de directorio ordenadas por nombre de archivo.

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. Usando os.File.Readdir

Readdir lee el contenido del directorio asociado con el archivo y devuelve un segmento de hasta n valores FileInfo, como lo devolvería Lstat, en orden de directorio. Las llamadas posteriores en el mismo archivo producirán FileInfos adicionales.

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 }

Resultados de referencia

Obtenga más detalles en esta publicación de blog


Puede intentar usar la función ReadDir en el paquete io/ioutil . Por los documentos:

ReadDir lee el directorio nombrado por dirname y devuelve una lista de entradas de directorio ordenadas.

El sector resultante contiene tipos os.FileInfo , que proporcionan los métodos enumerados here . Aquí hay un ejemplo básico que enumera el nombre de todo en el directorio actual (las carpetas están incluidas pero no están marcadas especialmente; puede verificar si un elemento es una carpeta utilizando el método 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()) } }


ioutil.ReadDir es un buen hallazgo, pero si hace clic y mira la fuente, verá que llama al método Readdir de os.File . Si está de acuerdo con el orden de directorio y no necesita la lista ordenada, entonces este método Readdir es todo lo que necesita.