2016-04-14 17 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上の

ディレクトリ:Linux上

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 

ディレクトリ:

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で動作します。

重要なアイデアはファイルを追加するイベントですが、LinuxおよびMac OSXではWriteフラグで開く必要があります。

+0

これは完全にトリックを行うように見えますが、私はまだそれを完全に得ていません。なぜこれがそうですか?そしてさらに:なぜw.Writeによってエラーが投げられないのですか? –

+2

あなたはbufioに書き込んでいるので、問題なくバッファにデータを格納するだけです。しかし、w.Flush()の呼び出しはおそらくエラーを返します。 –

+0

Facepalm! wFlush()は実際にエラーを返します... –

関連する問題