Làm thế nào để kiểm tra xem một tập tin hoặc thư mục tồn tại?


131

Tôi muốn kiểm tra sự tồn tại của tệp ./conf/app.initrong mã Go của mình, nhưng tôi không thể tìm thấy một cách tốt để làm điều đó.

Tôi biết có một phương thức của Tệp trong Java : public boolean exists(), trả về true nếu tệp hoặc thư mục tồn tại.

Nhưng làm thế nào điều này có thể được thực hiện trong Go?


7
Cũng lưu ý rằng tùy thuộc vào cách bạn sẽ sử dụng thông tin này mà bạn có điều kiện cuộc đua. Tất cả những gì bạn có thể nói là cách đây ít lâu, tập tin đã / không tồn tại; tại thời điểm bạn hành động trong bài kiểm tra, điều ngược lại có thể đúng. Thông thường sẽ tốt hơn nhiều khi kiểm tra trong khi thực hiện bất kỳ thao tác nào bạn định làm (ví dụ: không kiểm tra trước khi mở tệp hiện có hoặc tạo tệp mới nhưng thực hiện f, err := os.Open(name)hoặc f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)sau đó kiểm tra os.IsNotExist(err)).
Dave C

Câu trả lời:


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
}

Chỉnh sửa để thêm xử lý lỗi.


4
Nó trông giống như 'lập trình ngoại lệ' với tôi. Có tài nguyên nào chứng minh loại mã này là mô hình #golang chính thức không?
Olivier Amblet

21
@OlivierAmblet Không có ngoại lệ xảy ra ở đây. Go sử dụng paniccho một "ngoại lệ" như đối tượng thực tế. Bạn có thể "bắt" bằng một cuộc gọi đến recover. Hoàn toàn trả về một errgiá trị trả về thứ hai là một kỹ thuật Go cực kỳ phổ biến, thành ngữ. Xem: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
giải pháp không quá khó khăn, đi thật đặc biệt
zhoi Chi

1
Đúng là không có chức năng boolean Exists, nhưng mã ứng dụng có thể đơn giản hơn nếu bạn chỉ muốn kiểm tra sự tồn tại của một tệp:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Tại sao mọi thứ trong ngôn ngữ này rất phức tạp?
Mèo hàng đầu

123

Bạn có thể sử dụng điều này:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Xem: http://golang.org/pkg/os/#IsNotExist


6
Điều này tốt hơn câu trả lời được chấp nhận nhưng điều khoản khác có thực sự cần thiết?
Serge Koulikov

9
@SergeyKoulikov Có thể có các lỗi khác, như lỗi cho phép.
Denys Séguret

22

Thêm một FYI, vì tôi nhìn xung quanh trong vài phút nghĩ rằng câu hỏi của tôi là một tìm kiếm nhanh chóng.

Làm thế nào để kiểm tra nếu đường dẫn đại diện cho một thư mục hiện có trong Go?

Đây là câu trả lời phổ biến nhất trong kết quả tìm kiếm của tôi, nhưng ở đây và các nơi khác, các giải pháp chỉ cung cấp kiểm tra sự tồn tại. Để kiểm tra nếu pathđại diện cho một thư mục hiện có, tôi thấy tôi có thể dễ dàng:

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

Một phần của vấn đề của tôi là path/filepathgói dự kiến chứa hàm isDir ().



-2

Có một cách đơn giản để kiểm tra xem tập tin của bạn có tồn tại hay không:

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
    }
}

Đây là bản sao câu trả lời của Denys Séguret.
StardustGogeta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.