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 中国語 Web サイトの他の関連記事を参照してください。