Mais pourquoi cette URL est invalide?

GreensourceGreensource Membre
juin 2009 modifié dans API AppKit #1
Coucou tout le monde!
Je suis tombé sur un truc étrange, je veux créer une NSURL à  partir d'un NSString donc j'utilise:
NSURL* monURL = [NSURL URLWithString:maString];


Mais au debug, monURL vaut nil alors que maString valait:
/Users/pduchene/Cybervia/Recherche Cybervia/Menu/build/Debug/Menu.app/Contents/Resources/screen.png


Ce qui me semble bien valide pourtant...

ps: Je vous joint les quelques lignes de la fonction si ça peut aider:
NSBundle* mainBundle = [NSBundle mainBundle];<br />NSString* temp = [mainBundle pathForImageResource:@&quot;screen&quot;];<br />NSURL* rncFile = [NSURL URLWithString:temp];<br />[[NSWorkspace sharedWorkspace] openURL:rncFile];



[edit]
Grrrr, je viens de trouver juste après avoir poster! Il y a un espace dans mon URL ça dois provenir de ça!
Il existe un nom pour cette loi où l'ont trouve la soluce juste après avoir poster?
Pour pas être venu pour rien quand même, voici ce qu'il faut utiliser:
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

Et une petite question: J'utilise NSTUF8StringEncoding pour l'encodage, mais comment savoir lequel choisir?

Réponses

  • GreensourceGreensource Membre
    22:49 modifié #2
    Bon à  priori ce que j'ai dit plus haut reste correct. Sauf que c'est pas du tout ce que je voulais faire  :)

    En fait je voulais ouvrir un petit executable qui se trouve dans le dossier de ressources.
    Et c'est encore plus simple pour ça car les espaces sont gérer par le système.
    Donc il suffit:
    • De chopper la NSString correspondant au fichier
    • De faire un openFile avec cette NSString
  • mpergandmpergand Membre
    22:49 modifié #3
    Pour obtenir une url à  partir d'un chemin de fichier, il faut utiliser fileURLWithPath:
    <br />NSString* imgPath=[[NSBundle mainBundle] pathForImageResource:@&quot;mon image&quot;];<br />[[NSWorkspace sharedWorkspace] openURL:[NSURL fileURLWithPath:imgPath]];<br />
    


    La méthode inverse étant à  la condition que soit vrai.


  • zoczoc Membre
    juin 2009 modifié #4
    dans 1246002352:

    Coucou tout le monde!
    Je suis tombé sur un truc étrange, je veux créer une NSURL à  partir d'un NSString donc j'utilise:
    NSURL* monURL = [NSURL URLWithString:maString];
    


    Mais au debug, monURL vaut nil alors que maString valait:
    /Users/pduchene/Cybervia/Recherche Cybervia/Menu/build/Debug/Menu.app/Contents/Resources/screen.png



    Le problème, c'est surtout que quand on veut initialier un NSURL avec un chemin local, il faut utiliser + (id)fileURLWithPath:(NSString *)path et pas + (id)URLWithString:(NSString *)URLString

    Parce que le second constructeur de comodité exige une URL correctement formatée, ce qui n'est pas le cas d'un chemin...

    Edit: Je devrais lire les fils en entier avant de répondre, ça m'éviterait de faire une réponse qui a déjà  été faite ;)
  • AliGatorAliGator Membre, Modérateur
    22:49 modifié #5
    dans 1246002352:
    maString valait:
    /Users/pduchene/Cybervia/Recherche Cybervia/Menu/build/Debug/Menu.app/Contents/Resources/screen.png
    Ce qui me semble bien valide pourtant...
    Héhé en effet c'était là  toute ton erreur, puisque non ceci est un chemin d'accès POSIX valide mais n'est pas une URL valide, une URL commençant toujours par un protocole (machin://), qui est "http://"; pour accéder aux pages web via internet en utilisant le protocole HTTP, et "file://" pour l'accès aux fichiers locaux.
    URLWithString suppose d'avoir déjà  dans la NSString une URL formattée correctement, avec le protocole indiqué, l'URL encodée au besoin, etc. D'où l'existance de fileURLWithPath qui lui permet de créer ce genre d'URL bien formattée à  partir d'un chemin de fichier. Là  est toute la différence.

    dans 1246002352:
    Il existe un nom pour cette loi où l'ont trouve la soluce juste après avoir poster?
    Je ne crois pas mais tu as raison, on devrait lui donner un petit nom :P Elle irait bien dans les lois à  la c*n à  côté de la Loi de Murphy :P
  • GreensourceGreensource Membre
    22:49 modifié #6
    Coucou! Je me retrouve aujourd'hui avec un problème un peu similaire.
    J'ai un nom de fichier avec des espaces dedans. J'ai besoin de retrouve le path de ce fichier pour l'ouvrir, c'est un fichier PList.
    J'ai essayer avec la méthode:
    NSURL* anURL = [NSURL fileURLWithPath:mapName];

    Pour ensuite faire [anURL path], car pour ouvrir un PList il faut un NSString. Mais ça ne fonctionne pas.
    J'ai aussi essayer:
    - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding
    

    Mais idem ça ne fonctionne pas. Pourtant dès que je met un nom sans Espace ya pas de souci!
    J'ai bien regarder la partie Path des String mais je ne trouve rien.
    Un conseil?
  • AliGatorAliGator Membre, Modérateur
    22:49 modifié #7
    J'ai pas tout suivi sur "car pour ouvrir un PList il faut un NSString", mais de manière générale :
    - Quand une méthode qui sert à  ouvrir un fichier prend une NSURL, c'est sensé être une URL, locale (file://....) ou remote (http://... ou autre)
    - Mais quand une méthode qui a besoin d'un path prend un NSString en argument, ce NSString... c'est juste un path, un chemin d'accès local quoi. Ca n'a rien à  voir avec une URL. C'est un bête chemin de fichier. Pas de "PercentEscape", pas de "file://", pas de tout ça. Juste un truc comme "/Users/greensource/Documents/mon dossier à  moi/mon fichier à  ouvrir.plist" quoi.

    Pourquoi vouloir rajouter des %machin et %truc ? Tout ça n'est utile que lorsque tu utilises une URL. (Et encore dans ce cas la classe NSURL le fait pour toi si tu utilises la méthode fileURLWithPath dans ce cas si tu as besoin de ça).
    Mais là  je capte pas... tu prend un NSString, tu le transformes en NSURL via fileURLWithPath, et ensuite tu en extrait une NSString avec la méthode "path" ? Pourquoi ne pas partir directement de la NSString, pourquoi passer par NSURL dans ce cas ?

    Ou alors j'ai loupé un épisode :P
  • GreensourceGreensource Membre
    22:49 modifié #8
    En fait c'est ce que je faisait au début, mais impossile de trouver le fichier, je me retrouvais avec un nil systématiquement? Donc je me suis dit que ça venait de l'espace. C'est là  que je me suis rappelé avoir eu déjà  le problème avec des NSURL, d'où ma méthode désespéré avec les NSURL ^^

    Mais je continue de penser qu'il y a un souci avec les espaces puisque là  je l'ai est tous supprimer (ne trouvant pas de solution pour le moment) et bien ça fonctionne.
  • AliGatorAliGator Membre, Modérateur
    22:49 modifié #9
    On peut voir ton path et l'extrait de ton code qui l'utilise pour ouvrir le fichier ?
  • GreensourceGreensource Membre
    22:49 modifié #10
    J'écrivais ça:
    NSString* mapName = @&quot;Un Nom&quot;;<br />NSString * plistPath = [[NSBundle mainBundle] pathForResource:mapName ofType:@&quot;plist&quot;];
    

    Et à  chaque fois, plistPath = nil;
    Mais dès que j'ai écris:
    NSString* mapName = @&quot;UnNom&quot;;<br />NSString * plistPath = [[NSBundle mainBundle] pathForResource:mapName ofType:@&quot;plist&quot;];
    

    Ca roulais tout seul! Bien sur je vérifiais bien à  chaque fois que le nom du fichier était correct ;)
Connectez-vous ou Inscrivez-vous pour répondre.