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.
- 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)
}
}
- 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
}
- 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
}
- 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.