golangでファイルの存在確認
[tag:]
golangで開くファイルの存在確認をするときに、
if _, err := os.Stat(fn); err != nil {
fmt.Println("file doesn't exist")
}
としていたのだけど、Change25571で追加された例を見て、
if _, err := os.Stat(fn); os.IsNotExist(err) {
fmt.Println("file doesn't exist")
}
にしようと決めた。
ファイルの存在確認に関する関数としては、 os.IsExist(error)とos.IsNotExist(error)の2つがあるが、 linuxで言うと、前者は
err == syscall.EEXIST || err == syscall.ENOTEMPTY || err == ErrExist
を返し、後者は
err == syscall.ENOENT || err == ErrNotExist
を返す。
あるファイルを開くときに、あればそれを開き、なければエラーを返す、
というような処理では、os.IsNotExist(error)を使い、
あるファイルを作るときに、なければそれを作り、あればエラーを返す、
というような処理では、os.IsExist(error)を使うことになるのだろう。
os.Stat(string)は前者に相当するエラーを返すので、os.IsExist(error)では
チェックができない。
os.IsExist(error)は、os.OpenFileやos.Mkdir等と一緒に使うことになり、
標準パッケージでも、io/ioutilのTempFileやTempDirの実装に使われている。