2015-05-04 18 views
10

In Golang, wenn ich eine os.FileInfo habe, gibt es eine Möglichkeit, eine *os.File von selbst ohne den ursprünglichen Pfad zu öffnen?Öffnen einer Datei aus einer FileInfo

Lassen Sie uns sagen, dass ich so etwas wie dieses hatte:

package main 

import (
    "os" 
    "path/filepath" 
    "strings" 
) 

var files []os.FileInfo 

func walker(path string, info os.FileInfo, err error) error { 
    if strings.HasSuffix(info.Name(), ".txt") { 
     files = append(files, info) 
    } 
    return nil 
} 

func main() { 
    err := filepath.Walk("/tmp/foo", walker) 
    if err != nil { 
     println("Error", err) 
    } else { 
     for _, f := range files { 
      println(f.Name()) 
      // This is where we'd like to open the file 
     } 
    } 
} 

Gibt es eine Möglichkeit FileInfo-* File zu konvertieren? Der Code, mit dem ich gerade arbeite, basiert nicht auf filepath.Walk; aber ich bekomme eine []os.FileInfo Scheibe zurück. Ich habe immer noch das root-Verzeichnis und den Dateinamen, aber es scheint, als ob alle weiteren Unterbauminformationen um diese Stufe gegangen sind.

+1

Haben Sie versucht, den Pfad von Ihrem "Walker" -Func zu speichern? Damit erhalten Sie den vollständigen Pfad einschließlich Unterverzeichnis und Dateiname. Vielleicht verwenden Sie eine Map [string] os.FileInfo, um den Pfad als Schlüssel zu speichern und dann zum Öffnen der Datei zu verwenden. –

+0

Ich bin mir bewusst, dass das mir den vollen Weg geben würde, und mir würde es gut gehen. Wie ich schon in der Frage gesagt habe, benutze ich nicht den Dateipfad.Walk, daher habe ich die Pfadzeichenfolge zu der Zeit nicht. –

+2

Der Code, den ich tatsächlich habe verwendet ioutil.ReadDir und ist viel hässlicher als das Beispiel hier. Während ich weiß, dass es eine Lösung für das Problem auf höherer Ebene gibt, das ich habe (dh einen Verzeichnisbaum gehen und die Pfade speichern), ist meine spezielle Frage, ob ich all dieses Refactoring machen muss oder ob es einen einfachen Weg gibt, von dem aus zu gehen os.FileInfo an eine os.File? –

Antwort

9

Nein. Die FileInfo Schnittstelle gibt den Pfad einfach nicht frei und alle bereitgestellten Methoden in den Paketen os und ioutil akzeptieren den Pfadnamen als Zeichenfolge.

3

Nein, eine Datei kann nicht nur mit der FileInfo geöffnet werden. os.Open nimmt nur eine Zeichenfolge. Sie sollten immer den Pfad oder den übergeordneten Pfad haben, da dies die einzige Möglichkeit ist, eine FileInfo zu erhalten.

Verwandte Themen