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の実装に使われている。