it-swarm.asia

كيفية التحقق من وجود ملف في Go؟

لا تحتوي مكتبة Go القياسية على وظيفة مخصصة فقط للتحقق مما إذا كان الملف موجودًا أم لا (مثل Python os.path.exists ). ما هو اصطلاحي طريقة للقيام بذلك؟

335
Sridhar Ratnakumar

للتحقق مما إذا كان الملف غير موجود ، أي ما يعادل وظيفة بايثون 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


}
591
Sridhar Ratnakumar

الإجابة بواسطة Caleb Spare نشر في gonuts القائمة البريدية.

[...] ليست هناك حاجة فعلية في كثير من الأحيان و [...] باستخدام 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

107
OscarRyz

يجب عليك استخدام الدالتين 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
}

يتم استخراج المثال من هنا .

24
user11617

المثال بواسطة user11617 غير صحيح؛ سيُبلغ عن وجود الملف حتى في الحالات التي لا يوجد فيها ، ولكن كان هناك خطأ من نوع آخر.

يجب أن يكون التوقيع موجودًا (سلسلة) (منطقي ، خطأ). وبعد ذلك ، كما يحدث ، فإن مواقع الاتصال ليست أفضل.

الكود الذي كتبه سيكون أفضل:

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
}
12
user3431012
    _, 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)
    }
9
tangxinfa

مثال الوظيفة:

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

دعونا نلقي نظرة على بعض الجوانب أولاً ، فكل من الوظيفة التي توفرها حزمة os من golang ليست أدوات مساعدة ولكن أدوات فحص الأخطاء ، ماذا أعني بذلك أنها مجرد برنامج تجميع لمعالجة الأخطاء في النظام الأساسي.

لذا ، إذا كان os.Stat إذا كانت هذه الوظيفة لا تعطي أي خطأ ، فهذا يعني أن الملف موجود إذا كنت بحاجة إلى التحقق من نوع الخطأ ، وهنا يأتي استخدام هاتين الوظيفتين os.IsNotExist و os.IsExist.

يمكن فهم ذلك على أنه Stat من خطأ إلقاء الملف لأنه غير موجود أو أنه خطأ في الإلقاء لأنه موجود وهناك مشكلة في ذلك.

المعلمة التي تأخذها هذه الوظائف هي من النوع error ، على الرغم من أنك قد تتمكن من تمرير nil إليها ولكن ذلك لن يكون منطقياً.

يشير هذا أيضًا إلى حقيقة أن IsExist is not same as !IsNotExist ، هما طريقتان مختلفتان.

حتى الآن إذا كنت تريد معرفة ما إذا كان هناك ملف معين قيد التنفيذ ، فإن أفضل طريقة هي:

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
3
Farhaan Bukhsh