はじめに

前回の記事の続きです。
前回の記事はこちら

テキスト処理

前回同様テキスト処理についてやっていきます。
今回はファイルの操作をやっていきましょう。

ファイルの操作

ファイルの操作は他の言語でも頻出ですね。
早速やっていきます。

どのようなコンピュータ設備でもファイルは必要です。またWebプログラミングではファイルの操作はWebプログラマがよくぶつかる問題です。
ファイルの操作はWebアプリケーションにおいて必須で、非常に有用です。我々はよくディレクトリ(フォルダ)の生成、ファイルの編集といった操作をすることになります。

はい。

ディレクトリの操作

いくつかディレクトリ操作の関数があるようです。

func Mkdir(name string, perm FileMode) error

Linuxコマンドのmkdir ですね。
第2引数で、パーミッションが設定できるようです。(0777とか)

func MkdirAll(path string, perm FileMode) error pathに従って階層的なサブディレクトリを作成します。たとえばastaxie/test1/test2です。

mkdir -p ですね。
第2引数は同じくパーミッションです。

func Remove(name string) error

名前がnameのディレクトリを削除します。ディレクトリにファイルまたはその他のディレクトリがある場合はエラーを発生させます。

ディレクトリ削除ですね。
1階層のディレクトリかつ空のディレクトリしか削除しないようです。
(あまり使わなさそう)

func RemoveAll(path string) error
pathに従って階層的なサブディレクトリを削除します。たとえばpathがあるひとつの名前であった場合、このディレクトリ以下のサブディレクトリが全て削除されます。

これは、rm -fr ですね。
よく使うやつです。

早速サンプルを試してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import (
	"fmt"
	"os"
)

func main() {
	err := os.Mkdir("astaxie1", 0777)
	err = os.Mkdir("astaxie2", 0777)
	err = os.MkdirAll("astaxie3/test1/test2", 0777)
	err = os.MkdirAll("astaxie4/test1/test2", 0777)
	err = os.Remove("astaxie2")
	if err != nil {
		fmt.Println(err)
	}
	os.RemoveAll("astaxie4")
}
file-01

astaxie1, astaxie3ができていますね、
astaxie2astaxie4は作成してすぐに削除されましたね。

できているようです。

ファイルの操作

新規作成とファイルのオープン

今度はファイルの新規作成ですね。

func Create(name string) (file *File, err Error)

与えられたファイル名に従って新しいファイルを作成し、ファイルオブジェクトを返します。デフォルトでパーミッションは0666のファイルになります。返されたファイルオブジェクトは読み書きできます

Linuxコマンドで言うところの touch [ファイル名] ですね.

func NewFile(fd uintptr, name string) *File
ファイルディスクリプタに従って対応するファイルを作成し、ファイルオブジェクトを返します。
ファイルディスクリプタは、stdinとかstdout ですね、名前をつけてファイルを作成できるようです。

次はファイルのオープンです。

func Open(name string) (file *File, err Error)
このメソッドは名前がnameのファイルを開きます。しかし読み込みしかできません。内部では実はOpenFileがコールされています。
なるほど?

func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
名前がnameのファイルを開きます。flagはオープンモードです。読み込むだけか、読み書きできるかといったものです。permはパーミッションです。

ほうほう

ファイルへの書き込み

func (file *File) Write(b []byte) (n int, err Error) byte型の情報をファイルに書き込みます。  func (file *File) WriteAt(b []byte, off int64) (n int, err Error) 指定した位置から開始してbyte型の情報を書き込みます。 func (file *File) WriteString(s string) (ret int, err Error) string情報をファイルに書き込みます。

この辺も覚えないとですね。
サンプルがあるので早速やってみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
	"fmt"
	"os"
)

func main() {
	userFile := "astaxie.txt"
	fout, err := os.Create(userFile)
	if err != nil {
		fmt.Println(userFile, err)
		return
	}
	defer fout.Close()
	for i := 0; i < 10; i++ {
		fout.WriteString("Just a test!\r\n")
		fout.Write([]byte("Just a test!\r\n"))
	}
}
file-02
ファイルの読み込み

func (file *File) Read(b []byte) (n int, err Error) func (file *File) ReadAt(b []byte, off int64) (n int, err Error)

サンプルを試します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
	"fmt"
	"os"
)

func main() {
	userFile := "astaxie.txt"
	fl, err := os.Open(userFile)
	if err != nil {
		fmt.Println(userFile, err)
		return
	}
	defer fl.Close()
	buf := make([]byte, 1024)
	for {
		n, _ := fl.Read(buf)
		if 0 == n {
			break
		}
		os.Stdout.Write(buf[:n])
	}
}

出力結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
bash-5.0# go run file3.go 
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
Just a test!
bash-5.0# 

上手く行ってそうですね。

ファイルの削除

func Remove(name string) Error ファイルの削除は上記でできるようですね。

おわりに

次回「文字列の操作」