Maison > développement back-end > Golang > Pourquoi la lecture d'un fichier temporaire Go échoue-t-elle immédiatement après l'écriture ?

Pourquoi la lecture d'un fichier temporaire Go échoue-t-elle immédiatement après l'écriture ?

Mary-Kate Olsen
Libérer: 2024-12-01 05:58:09
original
338 Les gens l'ont consulté

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

Résoudre les problèmes de lecture dans la gestion des fichiers temporaires de Go

Dans Go, accéder aux données d'un fichier temporaire immédiatement après y avoir écrit peut s'avérer difficile bloc. Voici une description détaillée du problème et de la solution :

Le problème :

ioutil.TempFile de Go crée un fichier temporaire et l'ouvre en lecture et en écriture. Bien que les données puissent être écrites avec succès dans ce fichier, les opérations de lecture ultérieures échouent. En effet, le descripteur de fichier pointe vers la fin du fichier après l'écriture.

La solution :

Pour remédier à ce problème, le descripteur de fichier doit être replacé vers le début du fichier avant de tenter de le lire. Ceci peut être réalisé en utilisant la méthode Seek de *os.File. En ajoutant tmpFile.Seek(0, 0) avant l'opération de lecture, le pointeur de fichier est réinitialisé au début du fichier.

Exemple de code :

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)
    }
}
Copier après la connexion

Considérations supplémentaires :

  • Fichier Fermeture : Il est crucial de fermer le fichier temporaire après utilisation pour libérer les ressources du système. L'instruction defer dans l'exemple de code garantit que le fichier est fermé automatiquement lorsque la fonction est terminée, évitant ainsi les fuites de ressources.
  • Suppression du fichier : La suppression du fichier temporaire est également une étape essentielle. Ceci est généralement géré à l'aide de os.Remove() après la fermeture du fichier. L'ordre d'exécution des instructions defer est important, l'appel Close précédant l'appel Remove pour garantir un nettoyage correct du système.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal