2016-10-28

golangでファイルの存在確認

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

No comments:

Post a Comment