File 文件在Windows上填充数据,但在Linux上不填充

File 文件在Windows上填充数据,但在Linux上不填充,file,go,buffer,File,Go,Buffer,我制作了一个小型服务应用程序,将其输出写入多个文件。该服务必须同时在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) i

我制作了一个小型服务应用程序,将其输出写入多个文件。该服务必须同时在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*

我在这里遗漏了什么?

将您的标志从
os.O|u APPEND | os.O|u CREATE
更改为
os.O|u RDWR | os.O|u APPEND | os.O|u CREATE
将在Linux和Mac OSX上运行


关键的想法是,如果您想附加文件,您仍然需要在Linux和Mac OSX中使用Write标志打开。

虽然这似乎完全奏效,但我仍然不完全明白:为什么会这样?而且:为什么w.Write没有抛出错误?您正在写入一个bufio,所以它只是将数据存储在它的缓冲区中,没有任何问题。但是,对w.Flush()的调用可能会返回一个错误。@peterhomel,请注意,“Flush”操作实际上是“请确保数据确实到达其目的地”,因此检查错误是否返回确实非常重要。请注意,检查对打开进行写入的文件调用的
Close()
方法中的错误是一种很好的做法——请参阅中的备注。