# 7.5 ファイルの操作
どのようなコンピュータ設備でも、ファイルは必要です。またWebプログラミングでは、ファイルの操作はWebプログラマがよくぶつかる問題です。ファイルの操作はWebアプリケーションにおいて必須で、非常に有用です。我々はよくディレクトリ、ファイル(フォルダ)の編集といった操作を生成することになります。ここではGoによるこれらの操作に対して詳細な概要を作成し、どのように使用するか実例をお見せします。
## ディレクトリの操作
ファイル操作の大部分の関数はどれもosパッケージにあります。以下にいくつかディレクトリの操作を行うものを挙げます：

- func Mkdir(name string, perm FileMode) error

	名前がnameのディレクトリを作成します。パーミッションの設定はpermで、例えば0777です。
	
- func MkdirAll(path string, perm FileMode) error

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

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

- func RemoveAll(path string) error

	pathに従って階層的なサブディレクトリを削除します。たとえばpathがひとつの名前であれば、、このディレクトリは削除されません。


以下はデモコード：

	package main

	import (
		"fmt"
		"os"
	)
	
	func main() {
		os.Mkdir("astaxie", 0777)
		os.MkdirAll("astaxie/test1/test2", 0777)
		err := os.Remove("astaxie")
		if err != nil {
			fmt.Println(err)
		}
		os.RemoveAll("astaxie")
	}


## ファイルの操作

### 新規作成とファイルのオープン
ファイルを新規作成するには以下の２つのメソッドがあります

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

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

- func NewFile(fd uintptr, name string) *File
	
	ファイルディスクリプタに従って対応するファイルを作成し、ファイルオブジェクトを返します。


以下の２つのメソッドによってファイルを開きます：

- 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情報をファイルに書き込みます。
	
ファイルへの書き込みを行うコード例

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

### ファイルの読み込み
ファイルへの読み込みを行う関数：

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

	データを読み取りbに渡します

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

	offから開始してデータを読み取りbに渡します

ファイルを読み取るコード例：

	package main

	import (
		"fmt"
		"os"
	)
	
	func main() {
		userFile := "asatxie.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])
		}
	}

### ファイルの削除
Go言語ではファイルの削除とディレクトリの削除は同じ関数で行われます

- func Remove(name string) Error

	この関数をコールすることでファイル名がnameのファイルを削除できます

## links
   * [目次](<preface.md>)
   * 前へ: [テンプレートの処理](<07.4.md>)
   * 次へ: [文字列の処理](<07.6.md>)
