Chemin NSURL vs chaîne absolue

J’ai vu beaucoup de questions sur SO concernant la conversion entre NSURL et NSSsortingng . Ils impliquent tous d’utiliser soit NSSsortingng *path = [myURL absoluteSsortingng]; ou NSSsortingng *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é sur l’autre? J’ai essayé de consulter Apple Docs , mais je l’ai trouvé moins qu’utile.

Je suis habitué à ce que les URL ne soient mentionnées que dans les discussions concernant les sites Web et d’autres sujets concernant l’envoi d’informations entre différentes machines, et qu’elles ne soient jamais mentionnées uniquement lorsque la structure des fichiers est sur une seule machine. Peut-être est-ce la raison de ma confusion puisque NSURL semble être le moyen privilégié pour accéder 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.

Question 1:

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

Analysons cette écriture 6 lignes de code – 3 pour un local et 3 pour http URL – et en jouant un peu avec eux.

Créons un NSURL 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 chemin absolu ou relatif (vous pouvez trouver plus d’informations sur la création d’URL dans RFC 1808 page 3 ). Nous utilisons un chemin absolu qui commence par un / pour que nous nous /// avec /// .

 NSURL *aLocalURL = [NSURL URLWithSsortingng:@"file:///Users/dennis/Desktop/"]; NSLog(@"absolute ssortingng: %@", aLocalURL.absoluteSsortingng); NSLog(@"path: %@", aLocalURL.path); 

Sortie:

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

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

Remarque: path est un fichier (répertoire) URL et, à l’état des documents , la barre oblique finale est supprimée.


Regardons maintenant les URL distantes. Avec ce type d’URL, la plupart des gens sont plus familiers. Nous le créons en utilisant 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 URLWithSsortingng:@"http://www.apple.com/"]; NSLog(@"absolute ssortingng: %@", anHTTPURL.absoluteSsortingng); NSLog(@"path: %@", anHTTPURL.path); 

Sortie:

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

Encore une fois, nous voyons que la chaîne absolue connaît toujours son schéma, mais que path est maintenant / . Donc, le path semble ne pas être un moyen approprié lorsque vous travaillez avec des URL distantes.

Cependant, lorsque nous avons une URL comme http://www.apple.com/index.html nous obtenons

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

La lecture des documents aide aussi ici:

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

Donc, le path est tout ce qui commence (et inclut) à la barre oblique après l’ authority qui est www.apple.com dans notre cas.


question 2

Y a-t-il un moment où l’un devrait être utilisé sur l’autre?

De la documentation : (méthode: path )

Si cet object URL contient une URL de fichier (telle que déterminée avec isFileURL), la valeur renvoyée par cette méthode est adaptée à une entrée dans les méthodes de NSFileManager ou NSPathUtilities.

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


Conclusion:

Lorsque vous travaillez avec des URL distantes, vous utilisez (en général) absoluteSsortingng , sinon le résultat n’est pas ce que vous souhaitez (généralement).
Lorsque vous travaillez avec des URL locales, utilisez path .

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

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

A partir de la documentation pour “Accéder aux fichiers et répertoires”:

“Les URL basées sur des chemins sont plus faciles à manipuler, plus faciles à 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 exécutée. déplace un fichier dans le Finder, toute URL basée sur le chemin faisant référence au fichier devient immédiatement invalide et doit être mise à jour vers le nouveau chemin. Cependant, tant que le fichier est déplacé vers un autre emplacement sur le même disque, son identifiant unique modifier et toute URL de référence de fichier rest valide. ”

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