web-dev-qa-db-fra.com

NSURL path vs absoluteString

J'ai vu beaucoup de questions sur SO concernant la conversion entre NSURL et NSString. Ils impliquent tous d'utiliser soit NSString *path = [myURL absoluteString]; ou NSString *path = [myURL path];. Quelle est la différence réelle entre ces méthodes?Y a-t-il un moment où l'un devrait être utilisé plutôt que l'autre? J'ai essayé de consulter le Apple Docs , mais je l'ai trouvé moins utile.

Je suis habitué à ce que les URL ne soient mentionnées que dans les discussions concernant les sites Web et d'autres sujets relatifs à l'envoi d'informations entre différentes machines, et jamais lorsque l'on traite uniquement de la structure de fichiers sur une seule machine. C’est peut-être ce qui explique en partie ma confusion, car NSURL semble être le moyen privilégié d’accès aux fichiers, que ce fichier existe sur un réseau ou sur le périphérique local. Ou peut-être que c'est un sujet totalement indépendant. Je ne suis même pas sûr.

54
GeneralMike

Question 1:

Quelle est la différence réelle entre ces méthodes?

Analysons cette écriture de 6 lignes de code - 3 pour une URL locale et 3 pour une URL http - et les manipuler un peu.

Créons une NSURL en utilisant le schéma file://. Si vous vous demandez pourquoi il y a 3 / après file:, vous devez vous rappeler qu'il existe une URL complète d'un schéma (file:// et un chemin absolu ou relatif (vous pouvez trouver plus d'informations sur la création d'URL dans RFC 1808 à la page 3 ). Nous utilisons un chemin absolu qui commence par un / pour aboutir à ///.

NSURL *aLocalURL = [NSURL URLWithString:@"file:///Users/dennis/Desktop/"];
NSLog(@"absolute string: %@", aLocalURL.absoluteString);
NSLog(@"path: %@", aLocalURL.path);

Sortie:

chaîne absolue: fichier: /// Utilisateurs/dennis/Desktop /
chemin:/Utilisateurs/dennis/Bureau

Nous voyons donc que absoluteString connaît toujours son schéma alors que path ne dispose plus de cette information.

Remarque:path est une URL de fichier (répertoire) et, en tant que docs state, la barre oblique finale est supprimée.


Voyons maintenant les URL distantes. Avec ce type d'URL, la plupart des gens sont plus familiers. Nous le créons en suivant la même procédure que pour les URL locales. Notre schéma est maintenant http:// et notre path est www.Apple.com/.

NSURL *anHTTPURL = [NSURL URLWithString:@"http://www.Apple.com/"];  
NSLog(@"absolute string: %@", anHTTPURL.absoluteString);
NSLog(@"path: %@", anHTTPURL.path);

Sortie:

chaîne absolue: http://www.Apple.com/
chemin: /

De nouveau, nous voyons que la chaîne absolue connaît toujours son schéma, mais path est maintenant /. Donc, path ne semble pas être un moyen approprié de travailler avec des URL distantes.

Cependant, quand on a une URL comme http://www.Apple.com/index.html on obtient

chaîne absolue: http://www.Apple.com/index.html
chemin: /index.html

La lecture de la documentation aide ici aussi:

Selon la RFC 3986, la barre oblique après la partie autorité (nom d'hôte et port) est traitée comme faisant partie du chemin.

Donc, la path est tout ce qui commence (et y compris) par la barre oblique après la authority qui est www.Apple.com dans notre cas.


Question 2

Y at-il un moment où l'un devrait être utilisé sur l'autre?

À partir de docs : (méthode: path)

Si cet objet URL contient une URL de fichier (comme déterminé avec isFileURL), la valeur de retour de cette méthode convient pour une entrée dans les méthodes de NSFileManager ou de NSPathUtilities. 

À mon avis, cette phrase indique clairement que vous devriez utiliser path lorsque vous travaillez avec NSFileManager ou NSPathUtilities.


Conclusion:

Lorsque vous travaillez avec URL distantes, vous utilisez (généralement) absoluteString, sinon le résultat n'est pas ce que vous (généralement) voulez.
Lorsque vous travaillez avec URL locales, utilisez path.

Sources:
http://www.ietf.org/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc3986.txt
Référence de classe NSURL

130
HAS

Ajoutant à la réponse de HAS - les documents Apple mentionnent que les URL basées sur le chemin sont plus simples à certains égards. Cependant, les URL de référence de fichier ont l'avantage de conserver la validité de la référence si le fichier est déplacé ou renommé pendant l'exécution de votre application.

Dans la documentation "Accès aux fichiers et répertoires":

"Les URL basées sur les chemins sont plus faciles à manipuler, à déboguer et sont généralement préférées par des classes telles que NSFileManager. Un avantage des URL de référence de fichier est qu'elles sont moins fragiles que les URL basées sur des chemins lorsque votre application est en cours d'exécution. Si l'utilisateur déplace un fichier dans le Finder, toute URL basée sur un chemin qui fait référence au fichier devient immédiatement invalide et doit être mise à jour dans le nouveau chemin. Toutefois, tant que le fichier est déplacé vers un autre emplacement du même disque, son ID unique ne change et toute URL de référence de fichier reste valide. "

https://developer.Apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html

0
dougzilla