Bir dosyanın Belgeler klasöründe olup olmadığını nasıl kontrol edebilirim?


216

Kullanıcı bir şey satın aldığında, uygulamamın Belgeler klasörüne bir html dosyası indiren Uygulama İçi Satın Alma uygulamam var.

Şimdi bu HTML dosyasının var olup olmadığını kontrol etmeliyim, eğer doğruysa bu HTML dosyasını yükle, yoksa varsayılan html sayfamı yükle.

Bunu nasıl yapabilirim? İle NSFileManagerdışarı çıkamıyorum mainBundle..


"NSFileManager ile mainBundle'ın dışına çıkamıyorum" - bu yanlış bilgiyi nereden aldınız?

Yanıtlar:


521

Hızlı 3:

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

... dokümanlar dizininin dosya URL'sini verir. Aşağıdakiler foo.html adında bir dosya olup olmadığını kontrol eder:

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

Objective-C:

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

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

12
Jailbreak yaptıysanız bulduğunuz global dosya değil, uygulamanızın kişisel Belgeler dizininden bir dosya yüklediğinizi unutmayın. Uygulamanızı / Applications'a ana uygulama gibi yüklerseniz, dosya sisteminin tamamına erişir ve paylaşılan Belgeler dizinini kullanırsınız. İTunes veya XCode üzerinden yüklerseniz, uygulamalarınızın kişisel dizinini kullanırsınız. Dosyaları yedekleme amacıyla yerel dizininizde saklamak güzel.
Epsilon Prime

6
objectAtIndex: 0 artık firstObject ile değiştirilebilir
Govind

3
Ya da sadece [0]aracılığıyla endeksi erişen
temporary_user_name

firstObject [0] ve objectAtIndex'ten daha güvenlidir: 0
Itachi

1
@Itachi Aslında bu durumda dizide hiçbir nesne olmadığında istisnayı tercih ederim. Sonucu ise firstObjectolan nilApple çerçeveler içinde bir şeylerin ciddi bozuldu gibi program devam edebilir nasıl mantıklı şekilde, hiçbir var.
Nikolai Ruhe

14

Apple, fileExistAtPath: yöntemine güvenmemenizi önerir. Genellikle bir dosyayı açmaya çalışmak ve dosya yoksa hatayla uğraşmak daha iyidir.

NSFileManager Sınıfı Başvurusu

Not: Davranışı dosya sisteminin veya dosya sistemindeki belirli bir dosyanın durumuna göre yüklemeye çalışmak önerilmez. Bunu yapmak garip davranışlara veya yarış koşullarına neden olabilir. Bir işlemi denemek (dosya yüklemek veya dizin oluşturmak gibi), hataları kontrol etmek ve bu hataları işlemin başarılı olup olmayacağını önceden anlamaya çalışmaktan daha zarif bir şekilde işlemek çok daha iyidir. Dosya sistemi yarış koşulları hakkında daha fazla bilgi için, Güvenli Kodlama Kılavuzu'ndaki "Yarış Koşulları ve Güvenli Dosya İşlemleri" konusuna bakın.

Kaynak: Apple Developer API Başvurusu

Güvenli kodlama kılavuzundan.

Bunu önlemek için, programlar genellikle belirli bir ada sahip geçici bir dosyanın hedef dizinde bulunmadığından emin olur. Böyle bir dosya varsa, uygulama dosyayı siler veya çakışmayı önlemek için geçici dosya için yeni bir ad seçer. Dosya yoksa, uygulama dosyayı yazmak için açar, çünkü dosyayı yazmak için açan sistem yordamı, yoksa otomatik olarak yeni bir dosya oluşturur. Saldırgan, sürekli olarak uygun ada sahip yeni bir geçici dosya oluşturan bir program çalıştırarak (biraz kalıcılık ve biraz da şansla), uygulamanın geçici dosyanın bulunmadığından emin olmak için aradaki boşlukta dosyayı oluşturabilir ve yazmak için açtığında. Uygulama daha sonra saldırganın dosyasını açar ve üzerine yazar (unutmayın, sistem rutini varsa bir dosyayı açar, ve yalnızca mevcut bir dosya yoksa yeni bir dosya oluşturur). Saldırganın dosyası, uygulamanın geçici dosyasından farklı erişim izinlerine sahip olabilir, böylece saldırgan içeriği okuyabilir. Alternatif olarak, saldırganın dosyayı zaten açmış olabilir. Saldırgan dosyayı sabit bir bağlantıyla veya başka bir dosyaya (saldırganın sahip olduğu veya varolan bir sistem dosyasına ait) sembolik bir bağlantıyla değiştirebilir. Örneğin, saldırgan dosyayı sistem parolası dosyasına sembolik bir bağlantıyla değiştirebilir, böylece saldırıdan sonra sistem parolaları, sistem yöneticisi dahil hiç kimsenin oturum açamayacağı noktaya kadar bozulmuştur. Alternatif olarak, saldırganın dosyayı zaten açmış olabilir. Saldırgan dosyayı sabit bir bağlantıyla veya başka bir dosyaya (saldırganın sahip olduğu veya varolan bir sistem dosyasına ait) sembolik bir bağlantıyla değiştirebilir. Örneğin, saldırgan dosyayı sistem parolası dosyasına sembolik bir bağlantıyla değiştirebilir, böylece saldırıdan sonra sistem parolaları, sistem yöneticisi dahil hiç kimsenin oturum açamayacağı noktaya kadar bozulmuştur. Alternatif olarak, saldırganın dosyayı zaten açmış olabilir. Saldırgan dosyayı sabit bir bağlantıyla veya başka bir dosyaya (saldırganın sahip olduğu veya varolan bir sistem dosyasına ait) sembolik bir bağlantıyla değiştirebilir. Örneğin, saldırgan dosyayı sistem parolası dosyasına sembolik bir bağlantıyla değiştirebilir, böylece saldırıdan sonra sistem parolaları, sistem yöneticisi dahil hiç kimsenin oturum açamayacağı noktaya kadar bozulmuştur.


1
Bu iyi bir cevap olsa da kendi kendine büyük tavsiyelerde bulunuyor. Bunun küçük bir kod örneği ile nasıl uygulanabileceğini görmek iyi olur.
SnareChops

8

Dosya sisteminizi farklı bir şekilde kurarsanız veya bir dosya sistemi kurmanın farklı bir yolunu arar ve ardından belgeler klasöründe bir dosya olup olmadığını kontrol ederseniz başka bir örnek daha vardır. dinamik kontrolü de göster

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

Swift 2.0

Swift kullanarak dosyanın var olup olmadığını nasıl kontrol edersiniz

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

dosyanın belge / catchimage yolunun yanında olup olmadığını kontrol edin:

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 **)errorbunu sağladı

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

Veya Swift kullanarak

if let url = URL(fileURLWithPath: NSHomeDirectory()) {
    do {
        let result = try url.checkResourceIsReachable()
    } catch {
        print(error)
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.