Go의 표준 라이브러리에는 파일이 존재하는지 여부를 확인하는 기능 (Python ‘s 등 os.path.exists
)이 없습니다. 그것을 하는 관용적 방법 은 무엇입니까 ?
답변
파일이 존재하지 않는지 확인하려면 Python과 같습니다 if not os.path.exists(filename)
.
if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
// path/to/whatever does not exist
}
파일이 존재하는지 확인하려면 Python과 같습니다 if os.path.exists(filename)
.
편집 : 최근 댓글 당
if _, err := os.Stat("/path/to/whatever"); err == nil {
// path/to/whatever exists
} else if os.IsNotExist(err) {
// path/to/whatever does *not* exist
} else {
// Schrodinger: file may or may not exist. See err for details.
// Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence
}
답변
의해 답변을 Caleb Spare gonuts mailing list에 게시했습니다 .
[…] 실제로는 자주 필요하지 않으며 […] 사용
os.Stat
이 필요한 경우에 충분히 사용 하기 쉽습니다.[…] 예를 들어 파일을 열 경우 파일이 먼저 존재하는지 확인할 이유가 없습니다. 파일은 확인과 열기 사이에 사라질 수 있으며, 어쨌든
os.Open
오류 를 확인해야합니다 . 따라서os.IsNotExist(err)
파일을 열려고 시도한 후 호출 하고 존재하지 않는 파일을 처리합니다 (특별한 처리가 필요한 경우).[…] 당신은 전혀 존재하지 않는 경로를 확인할 필요가 없습니다.
os.MkdirAll
경로가 이미 존재하는지 여부에 관계없이 작동합니다. (또한 해당 호출에서 오류를 확인해야합니다.)을 사용하는 대신을
os.Create
사용해야합니다os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
. 이렇게하면 파일이 이미 있으면 오류가 발생합니다. 또한 이것은 존재 여부를 미리 확인하는 버전과 달리 파일을 만드는 다른 것과 경쟁 조건이 없습니다.
출처 : https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
답변
다음 예제 os.Stat()
와 os.IsNotExist()
같이 및 기능을 사용해야합니다 .
// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
답변
user11617 의 예제 가 올바르지 않습니다. 파일이 존재하지 않는 경우에도 파일이 존재한다고보고하지만 다른 종류의 오류가 발생했습니다.
서명은 Exists (string) (bool, error) 여야합니다. 그런 다음 호출 사이트가 더 나아지지 않습니다.
그가 작성한 코드는 다음과 같이 더 좋습니다.
func Exists(name string) bool {
_, err := os.Stat(name)
return !os.IsNotExist(err)
}
그러나 나는 이것을 대신 제안한다.
func Exists(name string) (bool, error) {
_, err := os.Stat(name)
if os.IsNotExist(err) {
return false, nil
}
return err != nil, err
}
답변
다른 답변이 놓친 것은 함수에 주어진 경로가 실제로 디렉토리 일 수 있다는 것입니다. 다음 함수는 경로가 실제로 파일인지 확인합니다.
func fileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
지적해야 할 또 다른 사항 :이 코드는 fileExists 함수가 실행되는 동안 다른 스레드 또는 프로세스가 지정된 파일을 삭제하거나 작성하는 경쟁 조건으로 이어질 수 있습니다.
이 문제가 걱정되면 스레드에서 잠금을 사용하거나이 기능에 대한 액세스를 직렬화하거나 여러 응용 프로그램이 관련된 경우 프로세스 간 세마포를 사용하십시오. 다른 응용 프로그램이 통제 범위를 벗어나면 운이 좋지 않을 것입니다.
답변
_, err := os.Stat(file)
if err == nil {
log.Printf("file %s exists", file)
} else if os.IsNotExist(err) {
log.Printf("file %s not exists", file)
} else {
log.Printf("file %s stat error: %v", file, err)
}
답변
기능 예 :
func file_is_exists(f string) bool {
_, err := os.Stat(f)
if os.IsNotExist(err) {
return false
}
return err == nil
}