web-dev-qa-db-fra.com

Vérifiez si le fichier existe à l'URL au lieu du chemin

Comment puis-je vérifier si un fichier existe à une URL (au lieu d'un chemin), afin de définir un magasin par défaut pré-rempli dans le simulateur iPhone:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
/*
 Set up the store.
 For the sake of illustration, provide a pre-populated default store.
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"Food" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
}

J'ai lu que dans les versions récentes des modèles, la méthode applicationDocumentsDirectory renvoie une URL, j'ai donc changé le code pour utiliser des objets NSURL pour représenter le chemin du fichier. Mais à [fileManager fileExistsAtPath:storePath], J'ai besoin de changer fileExistsAtPath en quelque chose comme fileExistsAtURL (évidemment ça n'existe pas).

J'ai vérifié la référence de classe NSFileManager et je n'ai trouvé aucune tâche appropriée adaptée à mon objectif.

Des indices s'il vous plaît?

60
Pedro Sousa
if (![fileManager fileExistsAtPath:[storeURL path]]) 
...

De la documentation :

Si cet objet URL contient une URL de fichier (telle que déterminée avec isFileURL), la valeur de retour de cette méthode convient pour l'entrée dans les méthodes de NSFileManager ou NSPathUtilities. Si le chemin a une barre oblique, il est supprimé.

119
Mundi

Pour une URL de système de fichiers NSURL elle-même a une méthode pour vérifier l'accessibilité d'une URL

NSError *error;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Food.sqlite"];
if ([storeURL checkResourceIsReachableAndReturnError:&error]) {
  // do something
} else {
  NSLog(@"%@", error);
}
15
vadian
if (![fileManager fileExistsAtPath:[storeURL path]]) 

est ok, mais attention: pour une URL comme:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

[storeURL path] vous donnera ce chemin (il s'applique à [storeURL lastPathComponent]:

..../Documents/1158a3c96ca22c41b8e731b1d1af0e1e

mais si vous utilisez lastPathComponent sur une chaîne comme /var/mobile/Applications/DB92F4DC-49E4-4B4A-8271-6A9DAE6963BC/Documents/1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50, cela vous donnera 1158a3c96ca22c41b8e731b1d1af0e1e?d=mm&s=50

Et c'est bien, puisque dans une url, '?' est utilisé pour les paramètres GET, mais si vous mélangez avec une chaîne, vous pourriez avoir des problèmes.

4
Mickaël