Conversion path - alias
tablier
Membre
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+
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+
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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...
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+
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à
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".
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é
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+
Tout sur POSIX path / POSIX file dans AppleScript (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...
L'appel en Objective-c (Son_Chemin contient le path absolu).
............
LeFormat = [NSString stringWithContentsOfFile:NSBundle mainBundle] pathForResource:@"format" ofType:@"txt";
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.
Ne fonctionne pas si Filevault est actif...
Ceci dit, y'a des fous qui activent FileVault ici ?
Faut savoir qu'il apporte plus de soucis qu'il n'amène de trucs sympas
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 ?
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
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 :
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
Ca ne marche pas alors que :
fonctionne.
Mais pourtant
affiche "michael:Desktop"
Donne "alias "michael:Desktop:""
Dit "Can't make POSIX file (alias "michael:Desktop:") into type reference."
Tu le dis quand tu veux t'arrêter
J'ai testé sur un nouveau compte (/Users/toto) et le résultat est le même.
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 :
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".
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à :