yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

goで、無ければディレクトリを作成した上で、ディレクトリ内のファイルに追記と上書きをする

2018-08-19

goで、無ければディレクトリを作成した上で、ディレクトリ内のファイルに追記と上書きをする

最初は動かすコードのみワークスペースにある状態。

% tree
.
└── filerw-test.go

0 directories, 1 file

中身は以下の通り。
check_dir ()で、無ければディレクトリを作成する。
make_line ()は、ファイルに書き込む情報を作成しているだけで、今回はタイムスタンプを書き込むこととする。
append_file()は、ファイルに追記をする関数で、対象ファイルはappend_file.txt。
overwrite_file()、ファイルに上書きをする関数で、対象ファイルoverwrite_file.txt。

% cat filerw-test.go
package main

import (
  "fmt"
  "os"
  "time"
)



var test_dir = "./files"
var test_file_append= "append_file.txt"
var test_file_overwrite = "overwrite_file.txt"
var test_path_append = fmt.Sprintf("%s/%s", test_dir, test_file_append)
var test_path_overwrite = fmt.Sprintf("%s/%s", test_dir, test_file_overwrite)



// check if directory exists
func check_dir () {
  if _, err := os.Stat(test_dir); os.IsNotExist(err) {
    os.Mkdir(test_dir, 0777)
  }
}



// make line
func make_line () string {
  line := time.Now().String()
  return line
}



// append line to file
func append_file (line string) {
  test_file_append, err := os.OpenFile(test_path_append, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)
  if err != nil {
      fmt.Println(err)
  }
  defer test_file_append.Close()
  fmt.Fprintln(test_file_append, line)
}



// overwrite line to file
func overwrite_file (line string) {
  test_file_overwrite, err := os.OpenFile(test_path_overwrite, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
  if err != nil {
      fmt.Println(err)
  }
  defer test_file_overwrite.Close()
  fmt.Fprintln(test_file_overwrite, line)
}



func main () {
  check_dir()
  line := make_line()
  append_file(line)
  overwrite_file(line)
}

os.OpenFile(<対象ファイル>, <オプション>) はファイルを操作する関数で、いくつかオプションが設定できる。
O_RDONLY、O_WRONLY、O_RDWRのどれかは必ず指定しなければならない。

O_RDONLY:読み取り専用
O_WRONLY:書き込み専用
O_RDWR:読み書き可能
O_APPEND:追記
O_CREATE:無ければファイル作成する
O_EXCL:O_CREATEと共に使われ、ファイルはすでにある場合はエラー
O_TRUNC:上書き

O_EXCLを使って、すでにファイルがある場合は、以下のようなエラーが生成される。

open ./files/append_file.txt: file exists

詳細はこちら
https://golang.org/src/os/file.go

それでは、先ほどのコードを実行。

% go run filerw-test.go

このようにディレクトリとファイルが作成される。

% tree
.
├── filerw-test.go
└── files
    ├── append_file.txt
    └── overwrite_file.txt

1 directory, 3 files

append_file()関数は追記をしているため、実行するたびにファイルの行が増えていく。

% cat files/append_file.txt
2018-08-19 17:19:41.67761193 +0900 JST m=+0.000376057
2018-08-19 17:20:05.85882505 +0900 JST m=+0.000328321
2018-08-19 17:20:07.947348331 +0900 JST m=+0.000292260
2018-08-19 17:20:09.116958053 +0900 JST m=+0.000303135

overwrite_file()は上書きのため、何度実行しても、最新の行のみが記載される。

% cat files/overwrite_file.txt
2018-08-19 17:20:09.116958053 +0900 JST m=+0.000303135