سؤال

قدم Snow Leopard العديد من الأساليب الجديدة لاستخدام كائنات NSURL للإشارة إلى الملفات، وليس إلى أسماء المسارات أو FSRefs للخدمات الأساسية.

ومع ذلك، هناك مهمة واحدة لا يمكنني العثور على طريقة تعتمد على عنوان URL لها:اختبار ما إذا كان الملف موجودًا.أنا أبحث عن إصدار يستند إلى عنوان URL لـ -[NSFileManager fileExistsAtPath:].مثل هذه الطريقة، يجب أن تعود YES إذا كان عنوان URL يصف أي شيء، سواء كان ملفًا عاديًا أو دليلاً أو أي شيء آخر.

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

يمكنني فقط استخدام NSFileManager fileExistsAtPath:, ولكن إذا كان هناك طريقة أكثر حداثة، فأنا أفضل استخدامها.

هل هناك طريقة أو وظيفة بسيطة في Cocoa أو CF أو Core Services مضمونة/موثقة لتخبرني ما إذا كان عنوان URL لملف معين (أو مرجع ملف) يشير إلى كائن نظام ملفات موجود؟

هل كانت مفيدة؟

المحلول

وNSURL لا يكون هذا الأسلوب:

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

وأي "عودة سواء وأشار المصدر إلى قبل أن يتم التوصل إلى URL الملف."

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
               isDirectory:NO];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    [[NSAlert alertWithError:err] runModal];

نصائح أخرى

في دائرة الرقابة الداخلية لم أجد أي طريقة أخرى ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}

هنا هو سويفت 2 إجابة:

var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)

وتحديد ما إذا كان ملف معين (أو الملفات المرجعية) يشير URL إلى كائن نظام الملفات الموجودة مكلف أصلا للموارد النائية، 10.6 فقط (وليس iPhoneOS) API لهذا CFURLResourceIsReachable () و[NSURL checkResourceIsReachableAndReturnError:] كلاهما متزامن، حتى لو كنت تستخدم لهم، لكثير من الملفات التي ستظل تبحث في النفقات العامة تأخير كبير.

ما يجب عليك فعله هو تنفيذ الخاص بك غير متزامن تدقيق روتينية مع التخزين المؤقت الذي يخلق حدة قائمة الموارد سارية المفعول.

وإلا فإن الملاحظات لCFURLResourceIsReachable في ولاية الرأس:

<اقتباس فقرة>   

ومثال سيكون الصيانة الدورية للدولة UI أن يتوقف   على وجود وثيقة معينة. عند إجراء   عملية مثل فتح ملف، هو أكثر كفاءة لمجرد محاولة لل   تشغيل والتعامل مع الفشل من أن تحقق أول لوسائل الأتصال.

ولأن NSURL يمكن يمثل أكثر من أنظمة الملفات المحلية، وأنا لا أعتقد أن هناك طريقة العامة التي يمكن اختبار لوجودهم في طريقة يمكن الاعتماد عليها. على الأقل، ومؤسسة الكاكاو لا يحتوي على وظيفة مثل هذه (بقدر ما أعرف).

إذا كنت تتعامل فقط مع أنظمة الملفات المحلية، وأقترح عليك لإنشاء فئة لNSURL أو NSFileManager، مع رسالة urlExists:. فإنه تحويل NSURL إلى NSString (مسار تطبيع) ومن ثم استدعاء رسالة [NSFileManager fileExistsAtPath:].

في سويفت يمكنك استخدام الأسلوب checkResourceIsReachable()، والتي للأسف إما العودة true (إذا كان الملف يمكن الوصول إليها) أو رمي خطأ (شرح لماذا لا يمكن الوصول إليها).

لتحصل منطقي القيمة الحقيقية / خطأ بدلا من ذلك، استخدم بناء الجملة التالي:

let exists = (try? inputFile.checkResourceIsReachable()) ?? false

إذا كنت ترغب في تسجيل الخطأ:

let exists: Bool
do {
  exists = try inputFile.checkResourceIsReachable()
} catch {
  exists = false
  print(error.localizedDescription)
}

ونضع في اعتبارنا هذا هو عملية مكلفة ويمكن أن يكون من تاريخ مباشرة بعد (إذا كانت بعض عملية أخرى حذف أو unmounts ملف قرص أثناء فحص كنت إذا كان موجودا).

في عام النهج المفضل هو عدم تحقق الطقس جود ملف، بدلا من ذلك ببساطة محاولة لقراءة أو الكتابة إلى ملف والتعامل مع أي خطأ بعد ذلك إذا فشلت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top