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