दस्तावेज़ फ़ोल्डर में कोई फ़ाइल मौजूद है या नहीं, इसकी जांच कैसे करें?


216

मेरे पास इन-ऐप खरीदारी के साथ एक आवेदन है, कि जब उपयोगकर्ता कुछ खरीदता है, तो मेरे ऐप के दस्तावेज़ फ़ोल्डर में एक html फ़ाइल डाउनलोड करें।

अब मुझे यह देखना होगा कि क्या यह HTML फ़ाइल मौजूद है, इसलिए यदि यह सच है, तो इस HTML फ़ाइल को लोड करें, अन्यथा मेरे डिफ़ॉल्ट HTML पृष्ठ को लोड करें।

मैं ऐसा कैसे कर सकता हूं? के साथ NSFileManagerमैं बाहर नहीं मिल सकता है mainBundle..


"NSFileManager के साथ मैं मेनबंडल से बाहर नहीं निकल सकता" - आपको गलत जानकारी का यह टुकड़ा कहाँ से मिला?

जवाबों:


521

स्विफ्ट 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)

उद्देश्य सी:

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

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

12
ध्यान दें कि आप अपने एप्लिकेशन के निजी दस्तावेज़ निर्देशिका से फ़ाइल लोड कर रहे हैं, न कि वैश्विक जिसे आप पाते हैं कि आप जेलब्रोकन हैं। यदि आप अपना एप्लिकेशन / एप्लिकेशन इनस्टॉल करते हैं जैसे कि यह एक मुख्य एप्लिकेशन था तो आपके पास संपूर्ण फ़ाइल सिस्टम तक पहुंच होगी और आप साझा दस्तावेज़ निर्देशिका का उपयोग करेंगे। यदि आप इसे iTunes या XCode के माध्यम से स्थापित करते हैं तो आप अपने एप्लिकेशन की निजी निर्देशिका का उपयोग करेंगे। बैकअप उद्देश्यों के लिए अपनी स्थानीय निर्देशिका में फ़ाइलों को संग्रहीत करना अच्छा है।
एप्सिलॉन प्राइम

6
objectAtIndex: 0 को अब FirstObject
Govind

3
या बस [0]के माध्यम से सूचकांक तक पहुँचने
temporary_user_name

FirstObject अधिक सुरक्षित है [0] और objectAtIndex: 0
Itachi

1
@ इताची वास्तव में इस मामले में मैं उस अपवाद को पसंद करता हूं जब सरणी में कोई वस्तु नहीं होती है। यदि का परिणाम firstObjectहै nilकि वहाँ कोई समझदार रास्ता कैसे इस कार्यक्रम जारी रख सकता है, के रूप में एप्पल चौखटे में कुछ गंभीरता से टूट गया है।
निकोलाई रुहे

14

Apple fileExistAtPath पर भरोसा करने के खिलाफ अनुशंसा करता है: विधि। अक्सर फ़ाइल को खोलने और फ़ाइल मौजूद न होने पर त्रुटि से निपटने का प्रयास करना बेहतर होता है।

NSFileManager वर्ग संदर्भ

नोट: फ़ाइल सिस्टम की वर्तमान स्थिति या फ़ाइल सिस्टम पर किसी विशेष फ़ाइल के आधार पर व्यवहार को समर्पित करने का प्रयास करने की अनुशंसा नहीं की जाती है। ऐसा करने से विषम व्यवहार या दौड़ की स्थिति पैदा हो सकती है। किसी ऑपरेशन का प्रयास करना बेहतर है (जैसे फ़ाइल लोड करना या निर्देशिका बनाना), त्रुटियों के लिए जाँच करें, और उन त्रुटियों को शालीनतापूर्वक संभालें, इससे यह जानने की कोशिश करें कि ऑपरेशन सफल होगा या नहीं। फ़ाइल सिस्टम रेस स्थितियों के बारे में अधिक जानकारी के लिए, "कोड स्थितियां और सुरक्षित फ़ाइल संचालन" सुरक्षित कोडिंग गाइड में देखें।

स्रोत: Apple डेवलपर API संदर्भ

सुरक्षित कोडिंग गाइड से।

इसे रोकने के लिए, प्रोग्राम अक्सर यह सुनिश्चित करने के लिए जांचते हैं कि एक विशिष्ट नाम वाली अस्थायी फ़ाइल लक्ष्य निर्देशिका में पहले से मौजूद नहीं है। यदि ऐसी कोई फ़ाइल मौजूद है, तो अनुप्रयोग इसे हटा देता है या विरोध से बचने के लिए अस्थायी फ़ाइल के लिए एक नया नाम चुनता है। यदि फ़ाइल मौजूद नहीं है, तो अनुप्रयोग लिखने के लिए फ़ाइल खोलता है, क्योंकि सिस्टम रूटीन जो स्वचालित रूप से लिखने के लिए एक फ़ाइल खोलता है, एक नई फ़ाइल बनाता है जो कोई भी मौजूद नहीं है। एक हमलावर, लगातार एक प्रोग्राम चला रहा है, जो उपयुक्त नाम के साथ एक नई अस्थायी फ़ाइल बनाता है, (थोड़ी दृढ़ता और कुछ किस्मत के साथ) जब अंतर अस्थायी फ़ाइल मौजूद नहीं थी, तो यह सुनिश्चित करने के लिए आवेदन के बीच की खाई में फ़ाइल बनाएँ। और जब यह लिखने के लिए इसे खोलता है। अनुप्रयोग फिर हमलावर की फ़ाइल खोलता है और उसे लिखता है (याद रखें, सिस्टम रूटीन एक मौजूदा फ़ाइल खोलता है यदि कोई है, और एक नई फ़ाइल बनाता है केवल अगर कोई मौजूदा फ़ाइल नहीं है)। हमलावर की फ़ाइल में एप्लिकेशन की अस्थायी फ़ाइल की तुलना में अलग-अलग एक्सेस अनुमतियां हो सकती हैं, इसलिए हमलावर तब सामग्री को पढ़ सकता है। वैकल्पिक रूप से, हमलावर के पास पहले से खुली हुई फ़ाइल हो सकती है। हमलावर फ़ाइल को हार्ड लिंक या प्रतीकात्मक लिंक के साथ किसी अन्य फ़ाइल में बदल सकता है (या तो हमलावर या किसी मौजूदा फ़ाइल के मालिक के पास)। उदाहरण के लिए, हमलावर फ़ाइल को सिस्टम पासवर्ड फ़ाइल के प्रतीकात्मक लिंक से बदल सकता है, ताकि हमले के बाद, सिस्टम पासवर्ड को इस बिंदु पर भ्रष्ट कर दिया गया हो कि सिस्टम व्यवस्थापक सहित कोई भी व्यक्ति लॉग इन न कर सके। वैकल्पिक रूप से, हमलावर के पास पहले से खुली हुई फ़ाइल हो सकती है। हमलावर फ़ाइल को हार्ड लिंक या प्रतीकात्मक लिंक के साथ किसी अन्य फ़ाइल में बदल सकता है (या तो हमलावर या किसी मौजूदा फ़ाइल के मालिक के पास)। उदाहरण के लिए, हमलावर फ़ाइल को सिस्टम पासवर्ड फ़ाइल के प्रतीकात्मक लिंक से बदल सकता है, ताकि हमले के बाद, सिस्टम पासवर्ड को इस बिंदु पर भ्रष्ट कर दिया गया हो कि सिस्टम व्यवस्थापक सहित कोई भी व्यक्ति लॉग इन न कर सके। वैकल्पिक रूप से, हमलावर के पास पहले से खुली हुई फ़ाइल हो सकती है। हमलावर फ़ाइल को हार्ड लिंक या प्रतीकात्मक लिंक के साथ किसी अन्य फ़ाइल में बदल सकता है (या तो हमलावर या किसी मौजूदा फ़ाइल के मालिक के पास)। उदाहरण के लिए, हमलावर फ़ाइल को सिस्टम पासवर्ड फ़ाइल के प्रतीकात्मक लिंक से बदल सकता है, ताकि हमले के बाद, सिस्टम पासवर्ड को इस बिंदु पर भ्रष्ट कर दिया गया हो कि सिस्टम व्यवस्थापक सहित कोई भी व्यक्ति लॉग इन न कर सके।


1
हालांकि यह एक अच्छा जवाब है, यह खुद को बड़ी सलाह प्रदान करता है। यह देखना अच्छा होगा कि इसे छोटे कोड उदाहरण के साथ कैसे लागू किया जा सकता है।
SnareChops

8

यदि आप अपना फ़ाइल सिस्टम अलग तरीके से सेट करते हैं या फ़ाइल सिस्टम सेट करने का एक अलग तरीका ढूंढते हैं और फिर यह जाँचते हैं कि क्या दस्तावेज़ फ़ोल्डर में मौजूद फ़ाइल किसी अन्य उदाहरण का उपयोग करती है। गतिशील जाँच भी दिखाएँ

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

4

स्विफ्ट 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)
}

3

जाँच करें कि क्या फ़ाइल दस्तावेज़ / कैचमेज पथ के पास मौजूद है:

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

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

0

NSURL.h ने - (BOOL)checkResourceIsReachableAndReturnError:(NSError **)errorऐसा करने के लिए प्रदान किया

NSURL *fileURL = [NSURL fileURLWithPath:NSHomeDirectory()];
NSError * __autoreleasing error = nil;
if ([fileURL checkResourceIsReachableAndReturnError:&error]) {
    NSLog(@"%@ exists", fileURL);
} else {
    NSLog(@"%@ existence checking error: %@", fileURL, error);
}

या स्विफ्ट का उपयोग कर

if let url = URL(fileURLWithPath: NSHomeDirectory()) {
    do {
        let result = try url.checkResourceIsReachable()
    } catch {
        print(error)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.