วิธีตรวจสอบว่ามีไฟล์หรือไดเรกทอรีอยู่หรือไม่


131

ฉันต้องการตรวจสอบการมีอยู่ของไฟล์./conf/app.iniในรหัส Go ของฉัน แต่ฉันไม่สามารถหาวิธีที่ดีในการทำเช่นนั้น

ฉันรู้ว่ามีวิธีการของไฟล์ใน Java: public boolean exists()ซึ่งผลตอบแทนจริงถ้าไฟล์หรือไดเรกทอรีที่มีอยู่

แต่สิ่งนี้สามารถทำได้ในโก


7
โปรดทราบว่าขึ้นอยู่กับว่าคุณจะใช้ข้อมูลนี้อย่างไรคุณมีสภาพการแข่งขัน ทั้งหมดที่คุณสามารถพูดได้คือเมื่อไม่นานมานี้ไฟล์ทำ / ไม่ได้อยู่; เมื่อถึงเวลาที่คุณทำการทดสอบสิ่งที่ตรงกันข้ามอาจเป็นจริง มักจะเป็นที่ดีมากในการตรวจสอบในขณะที่ทำสิ่งที่ดำเนินการคุณตั้งใจจะทำ (เช่นไม่ได้ตรวจสอบก่อนที่จะเปิดที่มีอยู่หรือการสร้างไฟล์ใหม่ แต่ไม่f, err := os.Open(name)หรือf, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)แล้วตรวจสอบos.IsNotExist(err))
เดฟ 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ว่าเป็นค่าที่สองเป็นเทคนิคธรรมดาที่ใช้สำนวนง่ายที่สุด ดู: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
วิธีการแก้ปัญหานั้นไม่ได้ จำกัด ช่องทางมากไปเป็นพิเศษ
จ้าวจื่อ

1
เป็นความจริงที่ว่าไม่มีฟังก์ชันบูลีนอยู่ แต่รหัสแอปพลิเคชันนั้นง่ายกว่าถ้าคุณต้องการตรวจสอบว่าไฟล์มีอยู่จริงหรือไม่if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
ทำไมทุกอย่างในภาษานี้จึงซับซ้อน?
Cat อันดับสูงสุด

123

คุณสามารถใช้สิ่งนี้:

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

ดู: http://golang.org/pkg/os/#IsNotExist


6
นี่ดีกว่าคำตอบที่ยอมรับ แต่ประโยคอื่นจำเป็นจริงๆหรือ
Sergey Koulikov

9
@SergeyKoulikov อาจมีข้อผิดพลาดอื่น ๆ เช่นการอนุญาต
Denys Séguret

22

มากกว่า FYI ​​เนื่องจากฉันมองไปรอบ ๆ ไม่กี่นาทีคิดว่าคำถามของฉันจะค้นหาได้อย่างรวดเร็ว

จะตรวจสอบว่า path แสดงถึงไดเร็กตอรี่ที่มีอยู่ใน Go ได้อย่างไร?

นี่คือคำตอบที่ได้รับความนิยมสูงสุดในผลการค้นหาของฉัน แต่ที่นี่และที่อื่น ๆ โซลูชันให้การตรวจสอบการมีอยู่เท่านั้น ในการตรวจสอบว่าpathเป็นไดเรกทอรีที่มีอยู่หรือไม่ฉันพบว่าฉันทำได้ง่าย ๆ :

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

ส่วนหนึ่งของปัญหาของฉันคือฉันคาดว่าpath/filepathแพคเกจจะมีฟังก์ชั่น isDir ()


13

วิธีง่ายๆในการตรวจสอบว่ามีไฟล์อยู่หรือไม่:

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

if _, err := os.Stat("/path/to/whatever"); err == nil {
    // path/to/whatever exists
}

แหล่งที่มา:


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