web-dev-qa-db-fra.com

Répertoire de liste dans Go

J'ai essayé de comprendre comment répertorier simplement les fichiers et les dossiers dans un seul répertoire dans Go.

J'ai trouvé filepath.Walk , mais il entre automatiquement dans les sous-répertoires, ce que je ne veux pas. Toutes mes autres recherches n'ont rien donné de mieux.

Je suis sûr que cette fonctionnalité existe, mais elle a été très difficile à trouver. Faites-moi savoir si quelqu'un sait où je devrais regarder. Merci.

156
Behram Mistree

Vous pouvez essayer d'utiliser la fonction ReadDir dans le package io/ioutil. Selon les documents:

ReadDir lit le répertoire nommé par dirname et renvoie la liste des entrées de répertoire triées.

La tranche résultante contient les types os.FileInfo, qui fournissent les méthodes répertoriées ici . Voici un exemple de base qui répertorie le nom de tout ce qui se trouve dans le répertoire en cours (les dossiers sont inclus mais pas spécialement marqués - vous pouvez vérifier si un élément est un dossier en utilisant la méthode 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())
    }
}
310
RocketDonkey

Encore plus simple, utilisez 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
}
67
Fatih Arslan

Nous pouvons obtenir une liste de fichiers dans un dossier du système de fichiers en utilisant diverses fonctions de la bibliothèque standard 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. Utilisation de filepath.Walk

Le paquetage path/filepath constitue un moyen pratique d’analyser tous les fichiers d’un répertoire. Il analysera automatiquement chaque sous-répertoire du répertoire.

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. Utilisation de ioutil.ReadDir

ioutil.ReadDir lit le répertoire nommé par nom et renvoie une liste d'entrées de répertoire triées par nom de fichier.

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

Readdir lit le contenu du répertoire associé au fichier et renvoie une tranche de n valeurs FileInfo au maximum, comme le ferait Lstat, dans l'ordre des répertoires. Des appels ultérieurs sur le même fichier donneront plus de FileInfos.

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
}

Résultats de référence.

benchmark score

Obtenez plus de détails à ce sujet Blog Post

50
manigandand

ioutil.ReadDir est une bonne trouvaille, mais si vous cliquez et regardez la source, vous voyez qu'elle appelle la méthode Readdir of os.File . Si vous êtes d'accord avec l'ordre des répertoires et que vous n'avez pas besoin de trier la liste, cette méthode Readdir est tout ce dont vous avez besoin.

21
Sonia