2016-05-06 3 views
2

В настоящее время я пишу некоторые идентификаторы файла, last_imported.txt. Каждый раз, когда я импортировал идентификатор, я хочу, чтобы файл содержал только это.WriteFile cancel mid-way

Похоже, что ioutil.WriteFile("last_import.txt", []byte(id), 0644) выполнит эту работу, однако он случайно оставляет файл пустым, не записывая новый идентификатор, когда я отменяю работу во время работы, имитируя внезапный сбой.

Я подозреваю, что всякий раз, когда он оставляет его пустым, это потому, что f.write(data) так и не был достигнут.

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 
} 

Как я могу убедиться, что файл не останется пустым?

+0

Почему бы не проверить вас подозрение, добавив протоколирование? –

ответ

2

Вы должны Close() файл с использованием defer. Это приведет к сбросу буфера в файловую систему.

См 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

Код, который я вставил, прямо из исходного кода Go (https://golang.org/src/io/ioutil/ioutil.go line 76) –

+0

Ops. Я думаю, проблема должна быть в вашем коде. Возможно, WriteFile никогда не называется? Добавьте журналы и опубликуйте собственный вывод кода и журналов. –

+0

Он называется, я могу его много раз отменить в случайное время, и он будет случайным образом оставить файл пустым. Он отлично работает 9 из 10 раз. –