web-dev-qa-db-fra.com

Comment vérifier si un fichier existe dans le dossier Documents?

J'ai une application avec achat intégré, qui permet à l'utilisateur d'acheter quelque chose, télécharger un fichier html dans le dossier Documents de mon application.

Maintenant, je dois vérifier si ce fichier HTML existe, donc si true, chargez-le, sinon chargez ma page HTML par défaut.

Comment je peux faire ça? Avec NSFileManager je ne peux pas sortir de mainBundle ..

206
Obliviux

Swift 3:

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

... vous donne une URL de fichier du répertoire de documents. Les éléments suivants vérifient s’il existe un fichier nommé foo.html:

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

Objectif c:

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

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

Apple recommande de ne pas s'appuyer sur la méthode fileExistAtPath :. Il est souvent préférable d'essayer simplement d'ouvrir un fichier et de traiter l'erreur si le fichier n'existe pas.

Référence de la classe NSFileManager

Remarque: Il est déconseillé d'essayer de prédire le comportement en fonction de l'état actuel du système de fichiers ou d'un fichier particulier sur le système de fichiers. Cela peut provoquer un comportement étrange ou des conditions de concurrence. Il est bien mieux d'essayer une opération (charger un fichier ou créer un répertoire, par exemple), rechercher les erreurs et les gérer avec élégance que d'essayer de déterminer à l'avance si l'opération aboutira. Pour plus d'informations sur les conditions de concurrence du système de fichiers, voir «Conditions de concurrence et opérations de fichier sécurisées» dans Guide de codage sécurisé.

Source: Référence de l'API de développeur Apple

À partir du guide de codage sécurisé.

Pour éviter cela, les programmes vérifient souvent qu’un fichier temporaire portant un nom spécifique n’existe pas déjà dans le répertoire cible. Si un tel fichier existe, l'application le supprime ou choisit un nouveau nom pour le fichier temporaire afin d'éviter tout conflit. Si le fichier n'existe pas, l'application ouvre le fichier en écriture, car la routine système qui ouvre un fichier en écriture crée automatiquement un nouveau fichier s'il n'en existe aucun . Un attaquant, en exécutant en permanence un programme créant un nouveau fichier temporaire avec le nom approprié, peut (avec un peu de persistance et un peu de chance) créer le fichier entre le moment où l'application vérifie que le fichier temporaire n'existe pas et quand il l'ouvre pour écrire. L’application ouvre ensuite le fichier de l’attaquant et l’écrit (rappelez-vous que la routine système ouvre un fichier existant, le cas échéant, et ne crée un nouveau fichier que s’il n’existe aucun fichier) . Le fichier de l’attaquant peut avoir des autorisations d’accès différentes de celles du fichier temporaire de l’application. L’attaquant peut alors lire le contenu. Sinon, l'attaquant peut avoir le fichier déjà ouvert. L'attaquant pourrait remplacer le fichier par un lien physique ou symbolique vers un autre fichier (appartenant à l'attaquant ou à un fichier système existant). Par exemple, l'attaquant pourrait remplacer le fichier par un lien symbolique vers le fichier de mot de passe système, afin qu'après cette attaque, les mots de passe système aient été corrompus au point que personne, y compris l'administrateur système, ne peut se connecter.

13
orkoden

Si vous configurez votre système de fichiers différemment ou si vous recherchez une autre façon de configurer un système de fichiers, vérifiez ensuite si un fichier existe dans le dossier Documents, en voici un autre exemple. afficher également la vérification dynamique

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;
    }
}
8
John Riselvato

Swift 2.0

Voici comment vérifier si le fichier existe en utilisant Swift

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)
}
4
Tal Zion

vérifie si le fichier existe à côté du chemin document/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** 
}
3
Mani Vannan
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
iOS