Go에 파일이 있는지 확인하는 방법은 무엇인가요?

Go의 표준 라이브러리에는 파이썬의 os.path.exists처럼 파일의 존재 여부를 확인하는 데만 사용되는 함수가 없습니다. 이를 수행하는 관용적 방법은 무엇인가요?

질문에 대한 의견 (5)
해결책

파일이 존재하지 않는지 확인하려면 파이썬의 if not os.path.exists(filename)와 동일합니다:

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
  // path/to/whatever does not exist
}

파일이 존재하는지 확인하려면 파이썬의 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

}
해설 (4)
    • 로 오토메이티드 케일럽이요 스페어를 실린 [고노츠] [1] 메일링 리스트.

&gt. [.] # 39 의 it& 실제로 필요한 것은 매우 자주 [.] '는' 오스릭스테 사용하여 경우를 쉽게 할 수 있는 것이 필요합니다.

&gt. [.] 예를 들면 다음과 같습니다. # 39 의 파일을 열고 예정이면 there& 첫 여부를 확인할 수 있을 이유가 없다. 어쨌든 간에, 파일 안에 사라질 수 검사 및 개설, # 39 오스트로펜 상관 없이 '오류' ll you& 확인해야 한다. 그래서 호출하십시오 (방황케) '' 오스지아노테시스트 시도하시겠습니까 후에는 됩니다 해당 파일을 열 수 있어, 및 거래 색상에는 비존재 (필요한 경우 특수 처리).

&gt. [.] # 39 don& 경로에 대한 기존 전혀 확인할 필요가 있습니다, t (진실이며당신이 shouldn& # 39, t).

&gt. - '여부를 패스이므로 오s. 케디라공' 는 이미 존재합니다. (또한 호출하십시오 오류 것을 확인해야 한다.)

&gt. 사용하는 대신 ',' - '로스 스크리트 콩지름에 오스트로펜필레 (경로, os. O_RDWR os.O_CREATE os.O_EXCL, 0666) '. # 39, ll 이쪽요 you& 오류가 발생할 경우 해당 파일이 이미 있습니다. 또한, 이 doesn& # 39 와 달리 무언가 할 수 있도록 파일 경합이 없는 버전이 존재를 확인하는 신청했다.

출처: msg/golang-nuts/ayx-bmndmfo/4rl8ffhr8v4j https://groups.google.com/forum/ #!

[1]: msg/golang-nuts/ayx-bmndmfo/4rl8ffhr8v4j https://groups.google.com/forum/ #!

해설 (0)

다음 예제에서와 같이 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
}

이 예제는 여기에서 발췌한 것입니다.

해설 (1)

user11617]1의 예는 잘못된 것으로, 파일이 존재하지 않지만 다른 종류의 오류가 있는 경우에도 파일이 존재한다고 보고합니다.

서명은 Exists(문자열)(부울, 오류)여야 합니다. 그리고 호출 사이트도 더 나을 것이 없습니다.

그가 작성한 코드는 다음과 같이 더 좋을 것입니다:

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
}
해설 (3)
    _, 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)
    }
해설 (0)

함수 예제:

func file_is_exists(f string) bool {
    _, err := os.Stat(f)
    if os.IsNotExist(err) {
        return false
    }
    return err == nil
}
해설 (1)

39 의 몇 가지 기능을 모두 제공하는 애스펙트에서 let& 보면 첫째, "os" 패키지 "고랭" 가 무슨 뜻이냐고 않습니다를 유틸리티와의 하지만 오류 검사 프로그램, 즉, 단 한 번의 래퍼 오류를 처리할 수 있는 크로스 플랫폼.

그래서 기본적으로, 만약 "오스릭스테" 만약 이 함수가 doesn& # 39, 즉, 모든 파일은 오류 안 줘 기존 않니다 경우 어떤 종류의 오류가 확인해야 합니다 (here comes the 사용하는 것은, 이 두 함수 "오스지아노테시스트" 와 "오스트리스시스트."

이 파일의 오류 때문에 "상태" 로 이해할 수 있도록 하고 있는지, 아니면 doesn& t # 39 는 몇 가지 문제가 존재하지 않고 던지기 때문에 오류가 있습니다.

이 형식은 "오류" 있을 수 있지만, 이러한 기능을 시행하십시오 매개변수입니다 벗어날 수 있지만, "모두" # 39 이 wouldn& 쉽게 이해할 수 없다.

또한 이 사실을 가리키는 "이즈시스트 같은 아노테시스트 아니다!", 이들은 서로 다른 두 가지 방법을 전지전능하심이라

이제 궁금해할까봐 선호하는 가, 내가 가장 좋은 방법은 해당 파일이 존재할 수 있다.

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
해설 (0)

그러나 실제로 어떤 경로를 다른 답을 도래하도록하려하는 누락했습니다 함수은 디렉토리여야. 물론, 같은 기능을 할 수 있는 경로는 매우 절실해졌습니다.

"' 부울 피레렉시츠 func (파일_이름 문자열) { 정보, 방황케: = os. Stat (파일_이름) 만약 os. 아노테시스트 (방황케) { 거짓값 반품하십시오. } 린포스시디르 복귀하십시오! () }

"'

또 지적하는: 이 코드는 계속 이어질 수 있는 다른 경쟁 상태 또는 프로세스 또는 지정된 파일을 만들 수 있고, 피레렉시츠 스레드할 deletes 함수은 실행되고 있습니다.

39 이 경우, re in your 스래드입니다 잠급니다 you& 걱정이 사용할 경우, 이 함수 또는 여러 개의 응용 프로그램이 사용하는 프로세스 간 세마포가 직렬화할 액세스하려면 있었다. 외부에 있는 경우 관련된 다른 응용 프로그램이 you& 컨트롤이거나, # 39, re 아웃해야 운빨이야, 그런 것 같아요.

해설 (0)