2016-05-06 6 views
2

Ich schreibe gerade einige Bezeichner in eine Datei, last_imported.txt. Jedes Mal, wenn ich einen Bezeichner importiere, möchte ich, dass die Datei nur diesen Inhalt enthält.WriteFile abgebrochen Mitte

Es sieht so aus, als würde ioutil.WriteFile("last_import.txt", []byte(id), 0644) den Job erledigen, aber es lässt die Datei nach dem Zufallsprinzip leer, ohne den neuen Bezeichner zu schreiben, wenn ich den Job abbringe und einen plötzlichen Absturz simuliere.

Ich vermute, dass, wenn es leer bleibt, es ist, weil f.write(data) nie erreicht wird.

func WriteFile(filename string, data []byte, perm os.FileMode) error { 
    f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) 
    if err != nil { 
     return err 
    } 
    n, err := f.Write(data) 
    if err == nil && n < len(data) { 
     err = io.ErrShortWrite 
    } 
    if err1 := f.Close(); err == nil { 
     err = err1 
    } 
    return err 
} 

Wie stelle ich sicher, dass die Datei nicht leer bleibt?

+0

Warum nicht Sie Verdacht zu überprüfen, indem die Protokollierung hinzugefügt? –

Antwort

2

Sie sollten Close() die Datei mit defer. Dies würde den Puffer zum Dateisystem leeren.

Siehe https://blog.golang.org/defer-panic-and-recover

func WriteFile(filename string, data []byte, perm os.FileMode) error { 
    f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) 
    if err != nil { 
     return err 
    } 

    defer f.Close() // <-- ADD THIS to close file ************************* 

    n, err := f.Write(data) 
    if err == nil && n < len(data) { 
     err = io.ErrShortWrite 
    } 
    if err1 := f.Close(); err == nil { 
     err = err1 
    } 
    return err 
} 
+0

Der Code, den ich eingefügt habe, stammt direkt aus dem Quellcode von Go (https://golang.org/src/io/ioutil/ioutil.go Zeile 76) –

+0

Ops. Ich schätze, das Problem sollte in deinem Code liegen. Wahrscheinlich wird das WriteFile nie aufgerufen? Fügen Sie Protokolle hinzu und veröffentlichen Sie Ihre eigene Code & Log-Ausgabe. –

+0

Es heißt, ich kann es oft zu einer zufälligen Zeit abbrechen, und es wird die Datei nach dem Zufallsprinzip verlassen. Es funktioniert gut 9 von 10 mal. –