Conversion path - alias

tabliertablier Membre
12:52 modifié dans API AppKit #1
Comment fait-on pour passer d'un chemin absolu du genre /Applications/Preview.app
au string équivalent complet: Volume_de_boot:Applications:Preview.app:
A part le faire "à  la main" je ne trouve pas de méthode pour faire cela, ni dans
NSFileManager, ni dans NSString (mais peut-être que je n'ai pas su lire!)
A+

Réponses

  • Eddy58Eddy58 Membre
    décembre 2005 modifié #2
    Tu as la méthode stringByExpandingTildeInPath dans NSString. :)
    Mais bon elle n'est valable que pour le répertoire utilisateur, je suppose qu'il te faut une méthode plus générique...
  • tabliertablier Membre
    12:52 modifié #3
    Oui, je cherche quelque chose qui me donne le chemin complet dans tout les cas. C'est
    pour appeler un AppleScript en lui passant le chemin absolu d'une application.
    Le chemin obtenu par "openPanel" est du genre "/Ledossier/Lapplication.app" et j'ai
    besoin d'un string du type "StartupDisk:Ledossier:Lapplication.app" (si Ledossier est
    au premier niveau du disque de boot)
    Donc, soit une (ou des) méthode(s) permet(tent) de faire cette transformation, soit
    je trouve le nom du "StartupDisk" et je fais ça en programmation directe.
    A+
  • AliGatorAliGator Membre, Modérateur
    12:52 modifié #4
    C'est marrant ça parce que j'allais justement te dire de voir du côté AppleScript pour faire la conversion ;)

    Dans le langage AppleScript il y a le mot clé "POSIX path" permettant d'utiliser des chemins POSIX (/Applications/Machin.app) plutôt que des alias, voire de convertir ces chemins POSIX en chemins type "alias"

    toutilédilà 
  • tabliertablier Membre
    12:52 modifié #5
    Passer par AScript, c'est bien ce que j'ai essayer de faire:

    Sous l'éditeur de script, le script suivant marche au poil, j'obtiens le nom du boot disk!
    -- essai
    set truc to (":Applications" as alias) as string
    set k to offset of ":" in truc
    log (get text 1 through (k - 1) of truc)

    Mais en créant le script avec objectif-C ça ne marche plus:
    LeSource = [NSString stringWithString: \
    @-- essai\n\
    set truc to (\":Applications\" as alias) as string\n\
    set k to offset of \":\" in truc\n\
    return (get text 1 through (k - 1) of truc)\n"] ;

    monScript = [[NSAppleScript alloc] initWithSource:LeSource] ; // Création du script
    descripteur = [monScript executeAndReturnError:&InfoErreur] ; // Exécution du script

    Dans ce cas, j'obtiens un descripteur à  nil, donc erreur.
    Bon je vais regarder le "POSIX path".
  • AliGatorAliGator Membre, Modérateur
    12:52 modifié #6
    dans 1134501464:
    C'est pour appeler un AppleScript en lui passant le chemin absolu d'une application.
    Et bien tu ne peux pas modifier ton AppleScript que tu veux appeler pour qu'il prenne un chemin POSIX au lieu d'un alias, du coup ?

    Et sinon tu peux pas compiler ton script dans l'éditeur de scripts et l'intégrer à  ton projet Xcode directement pour l'executer, plutôt que de créer le code AppleScript dynamiquement en Objective-C comme tu l'as fait dans ton dernier post ? En plus ça optimiserai car ça éviterai le passage obligé à  chaque fois par l'étape compilation : en mettant ton fichier script dans le projet il est précompilé ;)
  • tabliertablier Membre
    12:52 modifié #7
    J'ai, je pense, trouvé une solution.

    modifier: set truc to (\":Applications\" as alias) as string\n\
    en        : set truc to (\"::Applications\" as alias) as string\n\
    ça marche.

    Mon problème vient d'une connaissance insuffisante des alias Applescript.
    Merci à  tous.
    A+
  • AliGatorAliGator Membre, Modérateur
    décembre 2005 modifié #8
    Et tu ne veux vraiment pas essayer avec POSIX file / POSIX path ?
    set p to &quot;/Applications/Preview.app&quot;<br />set a to POSIX file p<br />return a -- retournera &quot;DisqueDur:Applications:Preview.app&quot;
    


    Tout sur POSIX path / POSIX file dans AppleScript  :o (déjà  mis mais pour rappel quoi)

    100x plus propre que de manipuler ton chemin d'accès directement ;)
    Oui je me répète, mais bon :P comme tu m'as déjà  dit que tu l'avais pô vu... ;)
  • tabliertablier Membre
    12:52 modifié #9
    Si, je l'ai lu et si dans un premier temps cela ne marchait pas, après correction d'une erreur cela marche parfaitement.

    L'appel en Objective-c (Son_Chemin contient le path absolu).
            ............
    LeFormat = [NSString stringWithContentsOfFile:NSBundle mainBundle] pathForResource:@&quot;format&quot; ofType:@&quot;txt&quot;;
    LeSource = [NSString stringWithFormat:LeFormat, Son_Chemin] ;

    monScript = [[NSAppleScript alloc] initWithSource:LeSource] ; // Création du script
    descripteur = [monScript executeAndReturnError:&InfoErreur] ; // Compilation-exécution du script

    if (descripteur == nil) // Erreur si nil
            .............etc

    Le fichier format.txt:
      Set p to "%@"
      set LePath to POSIX file p
      tell application "Finder"
        set Vers to (short version of (info for LePath))
      end tell
      return Vers

    Je sais, créer un NSScript dynamique n'est pas l'optimum d'éfficacité. Mais mon but est didactique et non la recherche d'efficacité.

    Merci pour les infos.
  • 12:52 modifié #10
    Sauf que
    <br />set p to &quot;/Volumes/DurDur/Michael/Desktop&quot;<br />set a to POSIX file p<br /><br />tell application &quot;Finder&quot;<br />	make new Finder window to folder &quot;a&quot;<br />end tell<br />
    


    Ne fonctionne pas si Filevault est actif...
  • AliGatorAliGator Membre, Modérateur
    12:52 modifié #11
    ??? ???

    Ceci dit, y'a des fous qui activent FileVault ici ? :D
    Faut savoir qu'il apporte plus de soucis qu'il n'amène de trucs sympas :p
  • décembre 2005 modifié #12
    Le fou l'utilise depuis que ça existe et même sur un mac de bureau... aucun problème. Evidemment faut pas faire de la vidéo de plusieurs giga dessus... Le truc sympa c'est que si un connard pique mon ordi il n'aura accès à  aucune adresse privée (tu vas me dire que je pourrais n'encoder qu'un dossier mais j'ai la flemme, la un clic et ça marche pour tout.
  • AliGatorAliGator Membre, Modérateur
    12:52 modifié #13
    dans 1135117060:

    Le fou l'utilise depuis que ça existe et même sur un mac de bureau... aucun problème. Evidemment faut pas faire de la vidéo de plusieurs giga dessus... Le truc sympa c'est que si un connard pique mon ordi il n'aura accès à  aucune adresse privée (tu vas me dire que je pourrais n'encoder qu'un dossier mais j'ai la flemme, la un clic et ça marche pour tout.
    Je savais que ça allais te titiller ;D
    J'aurais dû parier, j'aurais gagné gros  :) ;)

    Mais heu note : le chemin que tu as spécifié n'existe pas, si ? (A moins que ce soit une spécificité de FileVault que de ne pas avoir de dossier "Users" mais que ton dossier utilisateur soit directement à  la racine du disque dans ton disque "DurDur" ?
    Le bon chemin devrait être "/Volumes/DurDur/Users/Michael/Desktop", non ?

    Je sais que si le POSIX path n'existe pas, la transformation en alias risque de foirer. C'est sans doute la source deton problème, et non FileVault.
    Pour connaà®tre le chemin "à  la OSX" (POSIX path) de ton dossier home, ouvre le terminal (qui s'ouvre positionné dans ton répertoire home par défaut) et tape "pwd". Normalement ça t'affiche "/Users/Michael" mais si tu as délocalisé ton dossier Users sur une autre partition ou si FileVault fait un peu le malin il se peut que ça soit différent ? En particulier parce que j'imagine que FileVault monte l'image disque cryptée contenant tes données utilisateurs sur le point de montage "~/" directement et que peut-être que parce que ça reste un volume monté c'est géré différement ?
  • 12:52 modifié #14
    J'ai modifié l'emplacement depuis netinfo, c'est fait pour il me semble.
  • AliGatorAliGator Membre, Modérateur
    12:52 modifié #15
    Ah alors dans ce cas ce n'est sans doute pas FileVault qui est en cause !
    A moins que FileVault supopse que ton dossier utilisateur se trouve toujours dans /Users/ au lieu d'aller regarder dans le NetInfo ?

    Tu pourrais approfondir ton débug ?
    C'est à  dire tester le script :
    - dans les 2 sens (POSIX path -> alias et alias -> POSIX path)
    - avec le chemin réel actuel /Volumes/DurDur/Michael et le chemin supposé si tu n'avais pas changé dans netinfo /Users/Michael (et avec un autre chemin qui n'a rien à  voir avec ton dossier Users, genre /Applications/Utilitaires)
    - avec FileVault d'activé d'une part, de désactivé d'autre part
    - en remplaçant l'alias "textuel" (chaà®ne tapée en dur) par les mots clés genre "path to home folder" (syntaxe à  vérifier -- ça fait un bail que je n'ai pas fait d'AS)

    En mixant toutes les possibilités et nous disant ce que ça donne à  chaque fois on aura ainsi clairement isolé le problème pour voir si ça vient de netinfo, de FileVault, etc, etc
  • décembre 2005 modifié #16
    En fait c'est
    <br />tell application &quot;Finder&quot;<br />	make new Finder window to folder a<br />end tell<br />
    


    Le problème que je voulais signaler, c'est qu'avec filevaut, le dossier home est vu comme un volume (à  juste titre, c'est masqué maquillé par le finder qui place un lien symbolique à  l'ancien path du dossier...). Lorsque j'enregistre la création d'un dossier j'ai :
    tell application &quot;Finder&quot;<br />	activate<br />	select window of desktop<br />	make new folder at folder &quot;Desktop&quot; of item &quot;michael&quot; with properties {name:&quot;untitled folder&quot;}<br />end tell
    

    On remarque bien que michael est vu comme un volume. En supprimant le nouveau dossier et si je fait un run ça retourne... ("Finder got an error: Can't get some object.")

    Si je fais
    <br />tell application &quot;Finder&quot;<br />	make new Finder window to folder &quot;michael:Desktop&quot;<br />end tell
    

    Ca ne marche pas alors que :

    set p to &quot;/Volumes/DurDur/Michael/Desktop&quot;<br />set a to POSIX file p<br /><br />tell application &quot;Finder&quot;<br />	make new Finder window to folder a<br />end tell<br />
    

    fonctionne.

    Mais pourtant
    <br />set p to &quot;/Volumes/DurDur/Michael/Desktop&quot;<br />set a to POSIX file p<br />return a<br />
    

    affiche  "michael:Desktop"


    <br />set p to path to desktop folder<br />return p<br />
    

    Donne "alias "michael:Desktop:""

    <br />set p to path to desktop folder<br />set a to POSIX file p<br />return a<br />
    

    Dit "Can't make POSIX file (alias "michael:Desktop:") into type reference."

    Tu le dis quand tu veux t'arrêter :p

    J'ai testé sur un nouveau compte (/Users/toto) et le résultat est le même.

  • AliGatorAliGator Membre, Modérateur
    12:52 modifié #17
    Ouch.  :o

    Bon ceci dit j'ai l'impression qu'on s'emmelle les pinceaux (moi le premier) entre "POSIX file" et "POSIX path" et dans quel sens ils convertissent.

    Il y a un truc qui me gène dans tes extraits de code :
    set p to &quot;/Volumes/DurDur/Michael/Desktop&quot;<br />set a to POSIX file p<br />return a
    

    affiche  "michael:Desktop"
    Là  tu pars d'un chemin POSIX (à  la UNIX, avec des slashes) et avec "POSIX file p" tu convertis ça en alias. D'ailleurs il te retourne bien un chemin "à  la OS9".
    set p to path to desktop folder -- retourne : alias &quot;michael:Desktop:&quot;<br />set a to POSIX file p<br />return a
    

    Dit "Can't make POSIX file (alias "michael:Desktop:") into type reference."

    Ben oui et là  y'a un truc qui coince : "path to desktop folder" renvoie un path "à  la OS9", sous forme d'alias. Et tu lui appliques "POSIX file" dessus, alors que la variable p est sensée contenir un chemin POSIX et non un alias avec chemin OS9.
    Donc tu prends un alias et tu lui appliques la commande de conversion chemin POSIX -> chemin OS9, y'a comme un hic. Et dans ce sens l'erreur obtenue est donc normale.

    Ceci dit cela n'empêche pas qu'AppleScript s'emmèle les pinceaux entre dossier et/ou volume quand FileVault est activé de par ce masquage par le Finder que le dossier est en fait un volume/image disque...
    D'où l'importance d'utiliser "path to desktop folder" et non pas le chemin en dur... et de savoir que cela retourne un élément de type "alias" et non une chaà®ne représentant le chemin POSIX. Et que la conversion alias->chemin POSIX peut se faire avec "return POSIX path of (path to desktop folder)"

    D'ailleurs pour citer la page que j'ai déjà  citée 2 fois dans ce sujet, ils donnent bien dans les exempls ce genre là  :
    set a to path to application support from user domain
    set p to POSIX path of a
      --  "/Users/<login>/Library/Application Support/"
Connectez-vous ou Inscrivez-vous pour répondre.