Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie das neue io.FS für fs.WalkDir und listen Sie Dateien über verschiedene Dateisystemtypen hinweg auf

Verwenden Sie das neue io.FS für fs.WalkDir und listen Sie Dateien über verschiedene Dateisystemtypen hinweg auf

WBOY
WBOYnach vorne
2024-02-10 10:09:081126Durchsuche

使用新的 io.FS 到 fs.WalkDir 并列出跨文件系统类型的文件

Der Herausgeber von PHP empfiehlt die Verwendung des neuen io.FS zum Betrieb des Dateisystems, insbesondere bei Verwendung von fs.WalkDir und der Auflistung von Dateien über Dateisystemtypen hinweg. Mit dieser neuen Funktion können Dateivorgänge flexibler gehandhabt werden, sodass Benutzer die benötigten Dateiinformationen einfacher abrufen können. Ob im Entwicklungs- oder Wartungsprozess, diese Funktion kann die Effizienz erheblich verbessern und langwierige Vorgänge reduzieren. Wenn Sie mehr über die Verwendung dieser Funktion erfahren möchten, lesen Sie vielleicht weiter und wir stellen Ihnen die detaillierten Schritte und Vorsichtsmaßnahmen vor.

Frageninhalt

Ich verwende die neue io.FS-Abstraktion, um das Dateisystem zu durchqueren und die ersten 128 Bytes jeder Datei zu lesen, die unserer internen Dateierweiterung entspricht.

Diese Dateien befinden sich in lokalen Dateisystemen und Archivdateien usw. (ZIP und Tar, dachte ich).

Ich verwende fs.WalkDir und übergebe fs.FS (in meinen Tests os.DIR und fstest.MapFS). Beim Gehen gebe ich eine Reihe von „Dateien“ zurück (eigentlich handelt es sich um *.pzix- und *.pzi-Dateien, die unsere proprietären Formate sind). Ich kann keine geeignete Möglichkeit finden, die FS-Schnittstelle zu verwenden, um Informationen über die Datei, an der ich arbeite, abzurufen.

Ich möchte:

  • Dateinamen abrufen
  • Dateigröße ermitteln
  • Holen Sie sich die OpenFile-Methode

Ich finde die Schnittstellen von Java/C# in Go etwas verwirrend. Ich möchte mit der Abstraktion arbeiten, weiß aber nicht, wie ich die anderen Implementierungen der Datei selbst erhalten kann (z. B. verfügt die Dateischnittstelle über Stat() und read).

Das einfachste, was ich gefunden habe, ist, den Pfad und den Dateinamen in einem Array zu speichern. Wenn ich dann über das Array iteriere, stelle ich fest, ob es os.Dir oder fstest.MapFS ist, aber das scheint eher kontraintuitiv zu sein:

func collectFiles(f fs.FS, root string) []string {
 var files []string
 fs.WalkDir(f, ".", func(p string, d fs.DirEntry, err error) error {
  if !d.IsDir() { // we also check a few other things in the filename here
   f = filepath.Abs(path.Join(root, p))
   files = append(files, f)
  }
 }
 return files
}

Das gibt mir:

root = "m://" // mapfs
files = { "m://id-198271.pzi", "m://id-7125-092581.pzix"}

Gibt es für mich eine intelligentere Möglichkeit, mit der Abstraktion umzugehen, ohne diese Dinge zu tun? Denn nach der Rückgabe des Arrays muss ich die Datei „öffnen“, die ersten 128 Bytes (die Signatur) lesen und den Rest der Datei hashen, um sicherzustellen, dass sie „gültig“ ist.

EDIT: Zur Verdeutlichung: Die collectFiles-Methode erstellt unsere Hauptdatei-Trefferliste, die in einer anderen Methode verarbeitet werden soll. Ich möchte lokale Systemdateien, ZIP-Dateien und TAR-Dateien an die Methode übergeben, damit sie die Dateien im Archiv durchlaufen und sie einem Array hinzufügen kann.

Ich wünschte, es gäbe eine Dateischnittstelle, die ich in einem Array statt in einer Zeichenfolge speichern könnte, damit nachfolgende Aufrufer f.open() ausführen könnten, ohne zu wissen, was sich darunter befindet.

Workaround

p ist der Name im Dateisystem.

Erfragen Sie die Größe telefonisch fs.Stat(f, p)

Öffnen Sie Dateien mit f.Open(p)

Beispiel:

f := os.DirFS("/etc")
fs.WalkDir(f, ".", func(p string, d fs.DirEntry, err error) error {
    if !d.IsDir() {
        st, _ := fs.Stat(f, p)
        r, _ := f.Open(p)
        defer r.Close()

        // Read prefix
        var buf [md5.Size]byte
        n, _ := io.ReadFull(r, buf[:])

        // Hash remainder
        h := md5.New()
        _, _ = io.Copy(h, r)
        s := h.Sum(nil)

        fmt.Printf("%s %d %x %x\n", p, st.Size(), buf[:n], s)
    }
    return nil
})

Der Kürze halber werden in diesem Beispiel Fehler ignoriert. Tun Sie dies nicht in echtem Code.

https://www.php.cn/link/b599e8250e4481aaa405a715419c8179

Das obige ist der detaillierte Inhalt vonVerwenden Sie das neue io.FS für fs.WalkDir und listen Sie Dateien über verschiedene Dateisystemtypen hinweg auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen