ファイル

ファイル #

ファイルを作成する #

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>
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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)
	}
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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)
	}
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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
*/

play_circleRun open_in_newRun In The Playground

参考ドキュメント: bufio , os

ファイルを一定のサイズごとに読み込む #

ファイルを一定サイズごとに読み込むには 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
*/

play_circleRun open_in_newRun In The Playground

参考ドキュメント: bufio , io , os

ファイルを全て読み込む #

ファイルを一度に全て読み込む場合には osfunc 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
*/

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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>
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: os

ファイルに書き込みをする(ファイルがなければ作成する) #

ファイルに書き込みをしファイルがなければ作成をする場合は osfunc 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>
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: 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
}

play_circleRun open_in_newRun In The Playground

参考ドキュメント: os