Question

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

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

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

Était-ce utile?

La solution

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)

Objective-C:

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

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

Autres conseils

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

  

Référence de la classe NSFileManager

     

Remarque: La tentative de prédiction d'un comportement en fonction de l'état actuel du système de fichiers ou d'un fichier particulier sur le système de fichiers n'est pas recommandée. 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), de rechercher les erreurs et de les gérer correctement 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, reportez-vous à la section & # 8220; Conditions de course et opérations liées aux fichiers sécurisés & # 8221; dans le Guide de codage sécurisé.

Source: Référence de l'API pour les développeurs 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'a pas & # 8217; t existent et quand il l’ouvre pour l’écriture. L’application ouvre ensuite le fichier de l’attaquant et y écrit (rappelez-vous que la routine système ouvre un fichier existant s’il en existe un et ne crée un nouveau fichier que s’il n’y en a pas).   Le fichier de l'attaquant peut avoir des autorisations d'accès différentes de celles du fichier temporaire de l'application, de sorte que l'attaquant peut alors en lire le contenu. L’attaquant peut également 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, de sorte 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.

Si vous configurez votre système de fichiers différemment ou si vous cherchez 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;
    }
}
  

Swift 2.0

Voici comment vérifier si le fichier existe avec 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)
}

vérifie si un fichier existe dans le 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** 
}
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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top