ファイル #
ファイルを作成する #
os.Create
でファイルを作成する。 ファイルが存在する場合は空にする。
package main
import (
"fmt"
"os"
)
func main() {
// file1.txt を作成
f, err := os.Create("file1.txt")
fmt.Println(f, err) // == &{0xc000056180} <nil>
// file2.txt を作成して Hello World と書き込んでおく
if err := os.WriteFile("file2.txt", []byte("Hello World"), 0666); err != nil {
panic(err)
}
// file2.txt を開く. ファイルが既にある場合はファイルを空にする.
f, err = os.Create("file2.txt")
fmt.Println(f, err) // == &{0xc000056180} <nil>
// file2.txt を読み込んで空であることを確認
b := []byte{}
n, err := f.Read(b)
fmt.Printf("%v, %v, %v", string(b), n, err) // == , 0, <nil>
}
参考ドキュメント: os
ファイルを開く #
os.Open
でファイルを開く。 ファイルがなければエラーになる。
package main
import (
"fmt"
"os"
)
func main() {
// ファイルを作成
f, err := os.Create("file.txt")
fmt.Println(f, err) // == &{0xc000056180} <nil>
f.Close()
// ファイルを開く
f, err = os.Open("file.txt")
fmt.Println(f, err) // == &{0xc0000561e0} <nil>
f.Close()
// ファイルが存在しないとエラー
f, err = os.Open("file2.txt")
fmt.Println(f, err) // == <nil> open file2.txt: no such file or directory
}
参考ドキュメント: os
ファイルを開く(ファイルがなければ作成する) #
ファイルを開く際になければ作成もしてしまいたいという場合は func OpenFile(name string, flag int, perm FileMode) (*File, error)
を使う。
flag は os パッケージの定数で読み書きの権限や作成時の挙動を指定する。
この例のように os.O_RDWR|os.O_CREATE
とすると読み書き可能でファイルがなければ作成する、という意味になる。
perm は権限指定で Linux のファイルシステムで利用されている8進数での指定をする。
package main
import (
"os"
)
func main() {
f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
panic(err)
}
if err := f.Close(); err != nil {
panic(err)
}
}
参考ドキュメント: os
ファイルを削除する #
os.Remove
を使ってファイルを削除する。
package main
import (
"os"
)
func main() {
// ファイルの作成
f, err := os.Create("file.txt")
if err != nil {
panic(err)
}
if err := f.Close(); err != nil {
panic(err)
}
// ファイルの削除
if err := os.Remove("file.txt"); err != nil {
panic(err)
}
}
参考ドキュメント: os
ファイルを行ごとに読み込む #
ファイルを行ごとに読み込むには bufio.Scanner
が使える。
Scanner.Scan
はデフォルトで改行区切りでファイルハンドルからの読み込みを行う。指定をすれば任意の区切り文字を利用できる。
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// ファイルの作成
err := os.WriteFile("file1.txt", []byte("Hello\nNew\nWorld"), 0666)
if err != nil {
panic(err)
}
// ファイルを開く
f, err := os.Open("file1.txt")
if err != nil {
panic(err)
}
// ファイルを行ごとに読み込む
scanner := bufio.NewScanner(f)
n := 1
for scanner.Scan() {
fmt.Println(n, scanner.Text())
n += 1
}
if err := scanner.Err(); err != nil {
panic(err)
}
}
/* 出力
1 Hello
2 New
3 World
*/
ファイルを一定のサイズごとに読み込む #
ファイルを一定サイズごとに読み込むには bufio.Reader
が使える。
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
// ファイルの作成
err := os.WriteFile("file1.txt", []byte("Hello\nNew\nWorld"), 0666)
if err != nil {
panic(err)
}
// ファイルを開く
f, err := os.Open("file1.txt")
if err != nil {
panic(err)
}
// 読み込み処理の初期化
r := bufio.NewReader(f)
// 読み込みバッファの作成
buf := make([]byte, 10)
// ファイルをバッファに入れられる分づつ読み込む
for {
// size は読み込んだバイト数
size, err := r.Read(buf)
// ファイル末尾に到着したら終了
if err == io.EOF {
break
}
// 読み込んだ分だけ表示する(バッファは使いまわしているのでsize以降の要素には古いデータが入っている可能性がある)
fmt.Println(size, string(buf[:size]))
}
}
/* 出力
10 Hello
New
5 World
*/
ファイルを全て読み込む #
ファイルを一度に全て読み込む場合には os
の func ReadFile(name string) ([]byte, error)
が使える。
同様の目的で ioutil.ReadFile
が利用できるがバージョン 1.16 からは非推奨になっている。
package main
import (
"fmt"
"os"
)
func main() {
// ファイルの作成
err := os.WriteFile("file1.txt", []byte("Hello\nNew\nWorld"), 0666)
if err != nil {
panic(err)
}
data, err := os.ReadFile("file1.txt")
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
/* 出力
Hello
New
World
*/
参考ドキュメント: os
一時ファイルの作成 #
一時ファイルの作成には func CreateTemp(dir, pattern string) (*File, error)
が使える。
dir は保存先であり、空なら /tmp などのデフォルトの一時ディレクトリに保存される。
pattern はファイル名のパターンであり、デフォルトではこれを接頭辞としてランダムな文字列が続くファイル名になる。
*
でランダムな文字列を入れる箇所を指定することもできる。
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.CreateTemp("", "file1")
fmt.Println(f, err) // == &{0xc000098180} <nil>
fmt.Println(f.Name()) // == /tmp/file1871655907
f, err = os.CreateTemp("./", "file1_*.txt")
fmt.Println(f, err) // == &{0xc000122180} <nil>
fmt.Println(f.Name()) // == ./file1_1294444168.txt
}
参考ドキュメント: os
ファイルに書き込みをする #
File.WriteString
で書き込みを行う。
package main
import (
"fmt"
"os"
)
func main() {
// file1.txt を作成
f, err := os.Create("file1.txt")
if err != nil {
panic(err)
}
defer f.Close()
// 書き込み
size, err := f.WriteString("Hello World")
fmt.Println(size, err) // == 11 <nil>
// 書き込みができてる
data, err := os.ReadFile("file1.txt")
fmt.Println(string(data), err) // == Hello World <nil>
}
参考ドキュメント: os
ファイルに書き込みをする(ファイルがなければ作成する) #
ファイルに書き込みをしファイルがなければ作成をする場合は os
の func WriteFile(name string, data []byte, perm FileMode) error
が使える。
同様の目的で ioutil.WriteFile
が利用できるがバージョン 1.16 からは非推奨になっている。
package main
import (
"fmt"
"os"
)
func main() {
// ファイルの作成と書き込み
err := os.WriteFile("file1.txt", []byte("Hello World"), 0666)
if err != nil {
panic(err)
}
// 書き込みができていることを確認
data, err := os.ReadFile("file1.txt")
fmt.Println(string(data), err) // == Hello World <nil>
}
参考ドキュメント: os
ファイル情報の取得 #
package main
import (
"fmt"
"os"
)
func main() {
// ファイルの作成
f, err := os.Create("file1.txt")
if err != nil {
panic(err)
}
// ファイル情報の取得
fi, err := f.Stat()
if err != nil {
panic(err)
}
// ファイル名
fmt.Println(fi.Name()) // == file1.txt
// ファイルサイズ
fmt.Println(fi.Size()) // == 0
// 権限
fmt.Println(fi.Mode()) // == -rw-r--r--
// ファイルサイズ
fmt.Println(fi.ModTime()) // == 2021-10-21 09:08:03.448019056 +0000 UTC
}
参考ドキュメント: os