解決Go 臨時檔案處理中的讀取問題
在Go 中,寫入臨時檔案後立即存取資料可能會很麻煩堵塞。以下是問題和解決方案的詳細分析:
問題:
Go 的 ioutil.TempFile 建立一個臨時文件,打開它以進行讀取和寫入。雖然資料可以成功寫入該文件,但後續讀取操作會失敗。這是因為寫入後文件描述符指向文件末尾。
解決方案:
要解決此問題,必須將檔案描述符移回在嘗試讀取檔案之前先檢查檔案的開頭。這可以使用 *os.File 的 Seek 方法來實現。透過在讀取操作之前新增 tmpFile.Seek(0, 0),檔案指標將重設到檔案的開頭。
程式碼範例:
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) } }
額外注意事項:
以上是為什麼Go臨時檔案寫入後立即讀取失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!