222 votes

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

J'ai une application avec In-App Purchase, que lorsque l'utilisateur achète quelque chose, téléchargez un fichier html dans le dossier Documents de mon application.

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

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

Merci à tout le monde peut m'aider!

529voto

Nikolai Ruhe Points 45433
 NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
 

... vous donne le chemin vers le répertoire des documents. Les vérifications suivantes s'il y a un fichier nommé foo.html:

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

14voto

orkoden Points 2262

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

NSFileManager De Référence De Classe

Remarque: vous essayez de prédicat de comportement fondées sur l'état actuel du système de fichiers ou un fichier particulier sur le système de fichiers n'est pas recommandé. Cela peut provoquer un comportement anormal ou des conditions de course. Il est de loin préférable de tenter une opération (telle que le chargement d'un fichier ou créer un répertoire), vérifier les erreurs, et de traiter les erreurs gracieusement que c'est pour essayer de comprendre à l'avance si l'opération va réussir. Pour plus d'informations sur le système de fichiers des conditions de course, voir la section "Conditions de Course et de Sécuriser les Opérations de Fichier" dans le Guide de Codage Sécurisé.

Du sûr le guide de codage.

Pour éviter cela, bien souvent, les programmes assurez-vous un fichier temporaire avec un nom spécifique n'existe pas déjà dans le répertoire cible. Si un tel fichier existe, l'application supprime ou choisit un nouveau nom pour le fichier temporaire pour éviter les conflits. Si le fichier n'existe pas, l'application ouvre le fichier en écriture, parce que le système de routine qui ouvre un fichier en écriture crée automatiquement un nouveau fichier si il n'en existe aucun. Un attaquant, par la permanence de l'exécution d'un programme qui crée un nouveau fichier temporaire avec un nom approprié, peut (avec un peu de persévérance et un peu de chance) de créer le fichier dans l'écart entre le moment de l'application pour vérifier le fichier temporaire n'existait pas et quand il l'ouvre pour l'écriture. Ensuite, l'application ouvre l'attaquant du fichier et écrit (rappelez-vous, le système de routine ouvre un fichier existant si il y en a un, et crée un nouveau fichier seulement si il n'existe pas de fichier existant). L'attaquant du fichier peut avoir différentes autorisations d'accès de l'application, les fichiers temporaires, de sorte que l'attaquant peut alors lire le contenu. Sinon, l'attaquant ne peut avoir le fichier déjà ouvert. L'attaquant pourrait remplacer le fichier avec un lien en dur ou lien symbolique vers un autre fichier (qui est détenue par le pirate ou un fichier système existant). Par exemple, l'attaquant pourrait remplacer le fichier avec un lien symbolique vers le système de fichier de mot de passe, de sorte qu'après l'attaque, le système de mots de passe qui ont été endommagés au point que personne, y compris l'administrateur du système peut se connecter.

8voto

John Riselvato Points 5217

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 et que vous vérifiez ensuite si un fichier existe dans le dossier des documents, voici un autre exemple. montrer aussi 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;
    }
}
 

3voto

Mani Vannan Points 69

vérifier si le fichier existe à côté du chemin document / catchimage:

 NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *temName=[NSString stringWithFormat:@"%@/catchimage/%@.png",stringPath,@"file name"];
NSLog(@"%@",temName);
if([[NSFileManager defaultManager] fileExistsAtPath:temName]){
//ur code here
}
else{
//ur code here** 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X