search
LoginSignup
41

More than 3 years have passed since last update.

posted at

updated at

Goでファイル追記・存在しなかったらファイル作成したい!

私がはじめわからなかった、os.OpenFile関数のフラグについて少し書きます

Goのファイル開閉の種類

Goにはファイル読み書きの際のファイルの開き方にいくつか方法がありますよね。
os.Createos.NewFileos.Openos.OpenFileです。
そのうちOpenFileを使うと、引数にフラグを渡すことで、ファイルを開く際の大まかな設定ができます。
がっつり調べたらドキュメントに言及されてるんですが、Qiitaに記事があるとわかりやすいですよね!(そうですよね!??)

os.OpenFileの基本

os.OpenFileを使うときは第二引数に、用途に合わせてフラグを渡す必要があります

  • os.O_RDONLY //読み込む時
  • os.O_WRONLY //書き込む時
  • os.O_RDWR //読み書き両方する時

なお、第二引数に複数フラグを渡す場合は | で区切って渡してあげましょう。
とりあえず最後まで読み進めてみてください。

ファイルに追記がしたい!

基本的に何も考えずファイルを開いて書き込むと中身を全部上書きして書き込まれますよね。
追記したいときはos.OpenFileの第二引数にos.O_WRONLY及びos.O_APPENDをつけましょう。

EditFile.go
import(
    "os"
)
func main() {
    //引数: ファイルのパス, フラグ, パーミッション(わからなければ0666でおっけーです)
    file, err := os.OpenFile("test.txt", os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        //エラー処理
        log.Fatal(err)
    }
    defer file.Close()
    fmt.Fprintln(file, "書き込み〜!") //書き込み
}

ファイルが存在しなかった場合新規作成したい!

何も考えずにos.OpenFile()を使うと、もともとファイルが存在しなかった場合、エラーが発生します。
存在しなかった場合新規ファイルを作成する場合はos.OpenFileの第二引数にos.O_CREATEをつけましょう。

CreateNewFile.go
func main() {
    file, err := os.OpenFile("test.txt", os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        //エラー処理
        log.Fatal(err)
    }
    defer file.Close()
    fmt.Fprintln(file, "書き込み〜!") //書き込み
}

おさらい

では、ファイルに追記する存在しなかったら新規作成するを両方使ってみましょう。

osarai.go
func main() {
    //os.O_RDWRを渡しているので、同時に読み込みも可能
    file, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        //エラー処理
        log.Fatal(err)
    }
    defer file.Close()
    fmt.Fprintln(file, "書き込み〜") //書き込み
}

以上です。
このほかにもコアなものがいくつかあるので、詳しくはご自分で調べて見てください〜!
参考: http://golang.jp/pkg/os

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
41