Test de l’existence d’un fichier à l’aide de NSURL

Snow Leopard a introduit de nombreuses nouvelles méthodes pour utiliser des objects NSURL afin de faire référence à des fichiers, pas à des chemins d’access ou aux FSRef de Core Services.

Cependant, il existe une tâche pour laquelle je ne trouve pas de méthode basée sur une URL pour: tester si un fichier existe ou non. Je recherche une version basée sur URL de – [NSFileManager fileExistsAtPath: ] . Comme cette méthode, elle devrait renvoyer YES si l’URL décrit quelque chose, que ce soit un fichier normal, un répertoire ou autre chose.

Je pourrais essayer de rechercher diverses valeurs de ressource , mais aucune d’entre elles n’est explicitement garantie d’exister si le fichier ne fonctionne pas, et certaines d’entre elles (par exemple, NSURLEffectiveIconKey ) pourraient être coûteuses si elles le sont.

Je pourrais simplement utiliser le fichier fileXistsAtPath de fileExistsAtPath: mais s’il existe une méthode plus moderne, je préférerais l’utiliser.

Existe-t-il une méthode ou une fonction simple dans Cocoa, CF ou Core Services qui soit garantie / documentée pour me dire si une URL de fichier (ou de référence de fichier) donnée fait référence à un object de système de fichiers existant?

NSURL a cette méthode:

 - (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error 

Which “Indique si la ressource pointée par une URL de fichier peut être atteinte.”

 NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" isDirectory:NO]; NSError *err; if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) [[NSAlert alertWithError:err] runModal]; 

Sur iOS, je n’ai pas trouvé d’autre moyen …

 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"]; if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...} 

Voici la réponse Swift 2 :

 var error:NSError? let folderExists = theURL.checkResourceIsReachableAndReturnError(&error) 

Déterminer si une URL de fichier (ou de référence de fichier) donnée fait référence à un object de système de fichiers existant est insortingnsèquement coûteux pour les ressources distantes, les API 10.6 uniquement (pas d’iPhoneOS) pour ces CFURLResourceIsReachable () et [NSURL checkResourceIsReachableAndReturnError:] même si vous les utilisez, pour beaucoup de fichiers, vous attendez toujours un délai important.

Ce que vous devez faire est d’implémenter votre propre routine de vérification asynchrone avec mise en cache qui crée séparément une liste de ressources valides.

Sinon, les notes pour CFURLResourceIsReachable dans l’état d’en-tête:

Un exemple serait la maintenance périodique de l’état de l’interface utilisateur qui dépend de l’existence d’un document particulier. Lors de l’exécution d’une opération telle que l’ouverture d’un fichier, il est plus efficace d’essayer l’opération et de gérer les défaillances que de vérifier d’abord l’accessibilité.

Puisque NSURL peut représenter plus que des systèmes de fichiers locaux, je ne pense pas qu’il existe une méthode générique capable de tester leur existence de manière fiable. Au moins, la fondation Cocoa ne contient pas une telle fonction (pour autant que je sache).

Si vous ne gérez que des systèmes de fichiers locaux, je vous suggère de créer une catégorie pour NSURL ou pour NSFileManager , avec un message urlExists: Il convertit le NSURL en NSSsortingng (chemin normalisé), puis [NSFileManager fileExistsAtPath:] message [NSFileManager fileExistsAtPath:] .

Dans Swift, vous pouvez utiliser la méthode checkResourceIsReachable() , qui retournera malheureusement true (si le fichier est accessible) ou génère une erreur (expliquant pourquoi elle n’est pas accessible).

Pour obtenir une valeur bool true / false à la place, utilisez cette syntaxe:

 let exists = (try? inputFile.checkResourceIsReachable()) ?? false 

Si vous souhaitez enregistrer l’erreur:

 let exists: Bool do { exists = try inputFile.checkResourceIsReachable() } catch { exists = false print(error.localizedDescription) } 

N’oubliez pas qu’il s’agit d’une opération coûteuse et qui pourrait être périmée immédiatement après (si un autre processus supprime un fichier ou démonte un fichier de disque pendant que vous vérifiez s’il existe).

En général, l’approche privilégiée consiste à ne pas vérifier si un fichier existe, au lieu de cela, essayez simplement de lire ou d’écrire dans un fichier et de gérer les erreurs éventuelles en cas d’échec.