2016-04-14 3 views
3

Я сделал небольшое служебное приложение, которое записывает его вывод в несколько файлов. Служба должна работать как на Windows, так и на Linux. В Windows все очень сложно, но в Linux файлы создаются, но все они пустые.Файл заполнен данными в Windows, но не в Linux

Следующая небольшая программа точно показывает такое же поведение:

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
) 

func main() { 
    f, err := os.OpenFile("test.txt", os.O_APPEND|os.O_CREATE, 0777) 
    if err != nil { 
     fmt.Println(err.Error()) 
     return 
    } 
    defer f.Close() 

    w := bufio.NewWriter(f) 
    _, err = w.Write([]byte("hello")) 
    if err != nil { 
     fmt.Println(err.Error()) 
    } 
    w.Flush() 
} 

При запуске выше код не выводить какие-либо ошибки на Linux. Как видно из размера файла test.txt, он записывает содержимое в файл в Windows, в то время как он не работает в Linux.

Справочник по Windows:

Mode    LastWriteTime   Length Name 
----    -------------   ------ ---- 
-a----  14.04.2016  10:37   345 main.go 
-a----  14.04.2016  10:45    10 test.txt 
-a----  14.04.2016  10:37  2635264 writetest.exe 

Справочник по Linux:

drwxrwxr-x 2 localuser localuser 4096 Apr 14 10:55 ./ 
drwxr-xr-x 8 localuser localuser 4096 Apr 14 10:27 ../ 
-rw-rw-r-- 1 localuser localuser 345 Apr 14 10:37 main.go 
-rwxrwxr-x 1 localuser localuser 0 Apr 14 10:55 test.txt* 

Что я здесь отсутствует?

ответ

3

Изменить ваш флагфозный объект От os.O_APPEND|os.O_CREATE до os.O_RDWR|os.O_APPEND|os.O_CREATE будет работать на Linux и Mac OSX.

Основная идея - это событие, которое вы хотите добавить в файл, вам все равно нужно открыть флаг Write в Linux и Mac OSX.

+0

Хотя это, кажется, полностью делает трюк, я до сих пор не понимаю его полностью: почему это так? И более того: почему нет ошибки, вызванной w.Write? –

+2

Вы пишете файл bufio, поэтому он просто сохраняет данные в своем буфере без каких-либо проблем. Однако вызов w.Flush(), вероятно, вернет ошибку. –

+0

Facepalm! w.Flush() действительно возвращает ошибку ... –

Смежные вопросы