كيفية التحقق إذا كان الملف موجودا في مجلد المستندات?

StackOverflow https://stackoverflow.com/questions/1638834

سؤال

لدي التطبيق مع شراء في التطبيق ، أنه عندما يقوم المستخدم شراء شيء ما ، تحميل ملف html في مجلد المستندات من بلدي التطبيق.

الآن يجب أن تحقق ما إذا كان هذا الملف HTML موجودا ، حتى إذا كان هذا صحيحا ، تحميل هذا الملف HTML, آخر التحميل الافتراضي صفحة html.

كيف يمكنني أن أفعل ذلك ؟ مع NSFileManager لا أستطيع الحصول على خارج mainBundle..

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

المحلول

سويفت 3:

let documentsURL = try! FileManager().url(for: .documentDirectory,
                                          in: .userDomainMask,
                                          appropriateFor: nil,
                                          create: true)

... يعطيك URL ملف الدليل الوثائق. الاختبارات التالية إذا كان هناك ملف يسمى foo.html:

let fooURL = documentsURL.appendingPathComponent("foo.html")
let fileExists = FileManager().fileExists(atPath: fooURL.path)

الهدف-C:

NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString* foofile = [documentsPath stringByAppendingPathComponent:@"foo.html"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];

نصائح أخرى

وأبل توصي بعدم الاعتماد على fileExistAtPath: طريقة. انها في كثير من الأحيان من الأفضل أن مجرد محاولة لفتح ملف والتعامل مع الخطأ حالة عدم وجود الملف.

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

وNSFileManager الدرجة المرجعي

     

ملحوظة: محاولة المسند السلوك على أساس الحالة الراهنة للنظام الملفات أو ملف معين على نظام الملفات غير مستحسن. يمكن القيام بذلك يسبب السلوك أو العرق ظروف غريبة. إنها أفضل بكثير لمحاولة عملية (مثل تحميل ملف أو إنشاء دليل)، والتحقق من وجود أخطاء، والتعامل مع هذه الأخطاء بأمان مما هو عليه في محاولة لمعرفة قبل الموعد المحدد ما إذا كانت العملية ستنجح. لمزيد من المعلومات حول شروط السباق نظام الملفات، راجع "شروط السباق وعمليات تأمين ملف" في تأمين الترميز الدليل.

المصدر: أبل المرجعي API المطور

ومن دليل ترميز آمن.

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

لمنع هذا، البرامج غالبا ما تحقق للتأكد من ملف مؤقت مع اسم محدد غير موجود مسبقا في الدليل الهدف. في حالة وجود مثل هذه الملفات، وتطبيق حذف أو يختار اسما جديدا للملف مؤقت لتجنب الصراع. حالة عدم وجود الملف، يتم فتح التطبيق الملف للكتابة، لأن روتين النظام الذي يفتح ملف لكتابة تلقائيا بإنشاء ملف جديد في حالة وجود أي منها.   مهاجم، عن طريق تشغيل باستمرار البرنامج الذي يقوم بإنشاء ملف مؤقت جديد مع الاسم المناسب، يمكن (مع قليل من المثابرة وبعض الحظ) إنشاء ملف في الفجوة بين حين التحقق من تطبيق للتأكد من أن ملف مؤقت لم تكن موجودة وعندما يفتحه للكتابة. التطبيق ثم يفتح ملف المهاجم ويكتب عليه (تذكر، وروتين النظام يفتح ملف موجود إذا كان هناك واحد، ويقوم بإنشاء ملف جديد إلا إذا كان هناك أي ملف موجود).   قد يكون ملف المهاجم أذونات وصول مختلفة من ملف مؤقت للتطبيق، لذلك يمكن للمهاجم ثم قراءة محتويات. بدلا من ذلك، قد يكون المهاجم ملف مفتوح بالفعل. المهاجم يمكن أن تحل محل الملف مع ارتباط ثابت أو ارتباط رمزي إلى بعض الملفات الأخرى (إما واحدة مملوكة من قبل المهاجم أو ملف النظام القائم). على سبيل المثال، يمكن للمهاجم استبدال الملف مع ارتباط رمزي إلى ملف نظام كلمة السر، وذلك بعد الهجوم، تم تلف نظام كلمات السر لدرجة أن لا أحد، بما في ذلك المسؤول النظام، يمكن تسجيل الدخول.

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

for (int i = 0; i < numberHere; ++i){
    NSFileManager* fileMgr = [NSFileManager defaultManager];
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString* imageName = [NSString stringWithFormat:@"image-%@.png", i];
    NSString* currentFile = [documentsDirectory stringByAppendingPathComponent:imageName];
    BOOL fileExists = [fileMgr fileExistsAtPath:currentFile];
    if (fileExists == NO){
        cout << "DOESNT Exist!" << endl;
    } else {
        cout << "DOES Exist!" << endl;
    }
}

سويفت 2.0

هذا هو كيفية التحقق من ما إذا كان الملف موجودا باستخدام سويفت

func isFileExistsInDirectory() -> Bool {
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDirectory: AnyObject = paths[0]
    let dataPath = documentsDirectory.stringByAppendingPathComponent("/YourFileName")

    return NSFileManager.defaultManager().fileExistsAtPath(dataPath)
}

ومعرفة ما اذا كان الملف غير موجود في الجانب مسار المستند / catchimage:

NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *tempName = [NSString stringWithFormat:@"%@/catchimage/%@.png",stringPath,@"file name"];
NSLog(@"%@",temName);
if([[NSFileManager defaultManager] fileExistsAtPath:temName]){
    // ur code here
} else {
    // ur code here** 
}
NSArray *directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *imagePath =  [directoryPath objectAtIndex:0];
//If you have superate folder
imagePath= [imagePath stringByAppendingPathComponent:@"ImagesFolder"];//Get docs dir path with folder name
_imageName = [_imageName stringByAppendingString:@".jpg"];//Assign image name
imagePath= [imagePath stringByAppendingPathComponent:_imageName];
NSLog(@"%@", imagePath);

//Method 1:
BOOL file = [[NSFileManager defaultManager] fileExistsAtPath: imagePath];
if (file == NO){
    NSLog("File not exist");
} else {
    NSLog("File exist");
}

//Method 2:
NSData *data = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:data];
if (!(image == nil)) {//Check image exist or not
    cell.photoImageView.image = image;//Display image
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top