この記事は3年以上前に書かれた記事で内容が古い可能性があります
goで、無ければディレクトリを作成した上で、ディレクトリ内のファイルに追記と上書きをする
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