ホームページ > バックエンド開発 > Golang > Go 一時ファイルからの読み取りが書き込み直後に失敗するのはなぜですか?

Go 一時ファイルからの読み取りが書き込み直後に失敗するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-01 05:58:09
オリジナル
379 人が閲覧しました

Why Does Reading From a Go Temporary File Fail Immediately After Writing?

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)
    }
}
ログイン後にコピー

追加考慮事項:

  • ファイルの閉鎖: 使用後に一時ファイルを閉じてシステム リソースを解放することが重要です。コード例の defer ステートメントは、関数の終了時にファイルが自動的に閉じられるようにし、リソース リークを防ぎます。
  • ファイルの削除: 一時ファイルの削除も重要な手順です。これは通常、ファイルが閉じられた後に os.Remove() を使用して処理されます。 defer ステートメントの実行順序は重要です。適切なシステム クリーンアップを確保するために、Close 呼び出しが Remove 呼び出しの前に行われます。

以上がGo 一時ファイルからの読み取りが書き込み直後に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート