70 votes

Tests d'existence de fichier à l'aide de NSURL

Snow Leopard introduit de nombreuses nouvelles méthodes à utiliser NSURL objets pour se référer à des fichiers, pas des chemins d'accès ou des Services de Base' FSRefs.

Cependant, il y a une tâche que je ne peux pas trouver une URL de base de la méthode pour: Tester si un fichier existe. Je suis à la recherche d'une URL de la version de base -[NSFileManager fileExistsAtPath:]. Comme cette méthode, elle doit renvoyer YES si l'URL n'explique rien, si c'est un fichier, un répertoire, ou quoi que ce soit d'autre.

Je pourrais tenter de rechercher les différentes valeurs de la ressource, mais aucun d'entre eux sont explicitement garantie de ne pas exister si le fichier ne fonctionne pas, et certains d'entre eux (par exemple, NSURLEffectiveIconKey) pourrait s'avérer coûteux si elle n'.

Je pouvais NSFileManager de l' fileExistsAtPath:,, mais si il y a une méthode plus moderne, je préfère l'utiliser.

Est-il une simple méthode ou d'une fonction dans le Cacao, CF, ou des Services de Base garanti et documentés de me dire si un fichier donné (ou d'un fichier de référence) URL fait référence à un système de fichier de l'objet qui existe?

138voto

Elise van Looij Points 2254

NSURL n'ont cette méthode:

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

Qui "Retourne si la ressource pointée par une URL de fichier peut être atteint."

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

29voto

António Azevedo Points 161

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

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

2voto

valexa Points 2475

Déterminer si un fichier donné (ou d'un fichier de référence) URL fait référence à un système de fichier de l'objet qui existe est intrinsèquement coûteuse pour des ressources distantes, l'10.6 uniquement (pas de iPhoneOS) de l'api pour cette CFURLResourceIsReachable() et [NSURL checkResourceIsReachableAndReturnerror:] sont à la fois synchrone, même si vous voulez les utiliser, pour un grand nombre de fichiers que vous auriez encore être à la recherche à un retard significatif de frais généraux.

Ce que vous devez faire est de mettre en place votre propre asynchrone de vérification de routine avec la mise en cache que séparément crée une liste de ressources valides.

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

Un exemple serait l'entretien périodique de l'INTERFACE utilisateur de l'état qui dépend sur l'existence d'un document particulier. Lors de l'exécution d'un opération telle que l'ouverture d'un fichier, il est plus efficace de simplement essayer de l' fonctionnement et gérer les échecs que de vérifier d'abord pour l'accessibilité.

1voto

Laurent Etiemble Points 17360

Parce que NSURL représente plus que locale des systèmes de fichiers, je ne pense pas qu'il y est une méthode générique qui peuvent tester leur existence de manière fiable. Au moins, le Cacao, la fondation ne contient pas une telle fonction (autant que je sache).

Si vous ne traitez qu'avec des locaux des systèmes de fichiers, je vous suggère de créer une catégorie pour les NSURL ou NSFileManager, avec un urlExists: message. Il serait de convertir l' NSURL d'un NSString (normalisé chemin) puis d'appeler l' [NSFileManager fileExistsAtPath:] message.

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