파일이나 디렉토리가 있는지 확인하는 방법?


131

./conf/app.iniGo 코드 에 파일이 있는지 확인하고 싶지만 좋은 방법을 찾을 수 없습니다.

Java에 File 메서드가 있다는 것을 알고 public boolean exists()있습니다. 파일 또는 디렉토리가 존재하면 true를 반환합니다.

그러나 어떻게 이것을 Go에서 할 수 있습니까?


7
또한이 정보를 사용하는 방법에 따라 경쟁 조건이 있습니다. 당신이 말할 수있는 것은 조금 전에 파일이 존재했거나 존재하지 않았다는 것입니다. 테스트를 수행 할 때는 그 반대 일 수도 있습니다. 일반적으로 원하는 작업을 수행하는 동안 확인하는 것이 좋습니다 (예 : 기존 파일을 열거 나 새 파일을 만들기 전에 확인하지 않고 f, err := os.Open(name)또는 f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)확인한 다음 확인 os.IsNotExist(err)).
Dave C

답변:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

오류 처리를 추가하도록 편집되었습니다.


4
그것은 '예외 프로그래밍'처럼 보입니다. 공식 #golang 패러다임으로 이러한 종류의 코드를 정당화 할 수있는 자료가 있습니까?
Olivier Amblet

21
@OlivierAmblet 여기에는 예외가 없습니다. Go는 panic객체와 같은 실제 "예외"에 사용합니다. 을 (를) 호출하여 "잡을"수 있습니다 recover. err두 번째 반환 값으로 명시 적으로 반환하는 것은 매우 일반적이고 관용적 인 Go 기술입니다. 참조 : golang.org/doc/effective_go.html#errors
Chris Pfohl

13
해결책은별로 해롭지 않다. 특별하다
zhaozhi

1
부울 Exists 함수는 없지만 파일의 존재 여부 만 확인하려는 경우 응용 프로그램 코드가 더 간단 할 수 있습니다.if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
이 언어의 모든 것이 왜 그렇게 복잡한가?
톱 고양이


22

FYI의 더 많은 것, 나는 내 질문이 빠른 검색이라고 생각하면서 몇 분 동안 둘러 보았으므로.

Go에서 경로가 기존 디렉토리를 나타내는 지 확인하는 방법은 무엇입니까?

이것은 내 검색 결과에서 가장 인기있는 답변이지만 여기 및 다른 곳에서는 솔루션이 존재 확인 만 제공합니다. path기존 디렉토리를 나타내는 지 확인하기 위해 쉽게 할 수 있음을 발견했습니다.

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

내 문제의 일부는 path/filepath패키지에 isDir () 함수가 포함될 것으로 예상했다는 것 입니다.



-2

파일이 있는지 여부를 확인하는 간단한 방법이 있습니다.

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

이것은 Denys Séguret의 답변과 중복됩니다.
StardustGogeta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.