Beheben von Leseproblemen bei der Verarbeitung temporärer Dateien in Go
In Go kann der Zugriff auf Daten aus einer temporären Datei unmittelbar nach dem Schreiben in diese ein Stolperstein sein Block. Hier ist eine detaillierte Aufschlüsselung des Problems und der Lösung:
Das Problem:
Go's ioutil.TempFile erstellt eine temporäre Datei und öffnet sie sowohl zum Lesen als auch zum Schreiben. Während Daten erfolgreich in diese Datei geschrieben werden können, schlagen nachfolgende Lesevorgänge fehl. Dies liegt daran, dass der Dateideskriptor nach dem Schreiben auf das Ende der Datei verweist.
Die Lösung:
Um dieses Problem zu beheben, muss der Dateideskriptor zurück verschoben werden den Anfang der Datei, bevor Sie versuchen, sie zu lesen. Dies kann mit der Seek-Methode von *os.File erreicht werden. Durch das Hinzufügen von tmpFile.Seek(0, 0) vor dem Lesevorgang wird der Dateizeiger auf den Anfang der Datei zurückgesetzt.
Codebeispiel:
package main import ( "bufio" "fmt" "io/ioutil" "log" "os" "path/filepath" ) func main() { tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0]))) if err != nil { log.Fatal("Could not create temporary file", err) } defer tmpFile.Close() fmt.Println("Created temp file: ", tmpFile.Name()) fmt.Println("Writing some data to the temp file") if _, err = tmpFile.WriteString("test data"); err != nil { log.Fatal("Unable to write to temporary file", err) } else { fmt.Println("Data should have been written") } fmt.Println("Trying to read the temp file now") // Seek the pointer to the beginning tmpFile.Seek(0, 0) s := bufio.NewScanner(tmpFile) for s.Scan() { fmt.Println(s.Text()) } if err = s.Err(); err != nil { log.Fatal("error reading temp file", err) } }
Zusätzliche Überlegungen:
Das obige ist der detaillierte Inhalt vonWarum schlägt das Lesen einer temporären Go-Datei unmittelbar nach dem Schreiben fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!