[file] Go에 파일이 있는지 확인하는 방법

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
}