Question

Snow Leopard introduit de nombreuses nouvelles méthodes pour utiliser des objets NSURL pour faire référence à des fichiers, pas les services de base ou noms de fichiers de les FSRefs.

Cependant, il y a une tâche que je ne peux pas trouver une méthode basée sur l'URL pour: vérifier si un fichier existe. Je suis à la recherche d'une version basée sur l'URL de - [NSFileManager fileExistsAtPath:] . Comme cette méthode, il doit retourner YES si l'URL décrit quoi que ce soit, que ce soit un fichier régulier, un répertoire, ou quoi que ce soit d'autre.

Je pourrais essayer de rechercher divers

Autres conseils

Sur iOS, je ne pouvais pas trouver une autre façon ...

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

Voici le Swift 2 réponse:

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

Déterminer si une URL fichier (ou un fichier de référence) donnée fait référence à un objet système de fichiers qui existe est intrinsèquement coûteux pour les ressources à distance, 10,6 seulement (pas iphoneos) api est pour cette CFURLResourceIsReachable () et [NSURL checkResourceIsReachableAndReturnError:] sont à la fois synchrone, même si vous utilisez les, pour un grand nombre de fichiers que vous toujours à la recherche à une surcharge de retard important.

Ce que vous devez faire est de mettre en œuvre votre propre programme de contrôle asynchrone avec la mise en cache qui crée séparément une liste des ressources valides.

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

  

Un exemple serait l'entretien périodique de l'état d'interface qui dépend   sur l'existence d'un document particulier. Lorsque vous effectuez une   opération telle que l'ouverture d'un fichier, il est plus efficace d'essayer simplement   fonctionnement et gérer les échecs que de vérifier d'abord pour joignabilité.

Parce que NSURL peut représente plus que les systèmes de fichiers locaux, je ne pense pas qu'il y ait une méthode générique qui peut tester leur existence de manière fiable. Au moins, la base de cacao ne contient pas une telle fonction (pour autant que je sache).

Si vous ne traitez avec les 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 convertirait le NSURL à un NSString (chemin normalisé), puis invoquer le message [NSFileManager fileExistsAtPath:].

Dans Swift, vous pouvez utiliser la méthode checkResourceIsReachable(), qui soit le retour malheureusement true (si le fichier est accessible) ou jeter une erreur (ce qui explique pourquoi il ne peut pas être atteint).

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

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)
}

Gardez à l'esprit c'est une opération coûteuse et il pourrait être à jour immédiatement après (si un autre processus supprime une ou démonte un fichier de disque pendant que vous vérifiez si elle existe).

En général, la meilleure approche est de ne pas vérifier wether un fichier existe, au lieu de tenter simplement de lire ou d'écrire dans un fichier et de gérer toute erreur par la suite si elle échoue.

scroll top