Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[RubyCocoa]trouver l'original d'un alias

9 réponses
Avatar
pere.noel
je sais retrouver l'original d'un alias par AppleScript et patpro m'a
filé un script perl qui marche impec (légérement + rapide qu'AS disons,
au mieux, 20 %°

mais je souhaite une solution Obj-C/Cocoa qui ne dépende pas de
l'installation de perl (qui réclame pour ce faire les modules : use
Mac::Errors;
use Mac::Files;
use Mac::Resources; )

on m'a filé une page sur laquelle il y a les infos :
<http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileM
gmt/Tasks/ResolvingAliases.html>

mais je ne vois pas ce qu'il faut, en ruby, pour appeller ces classes et
leurs méthodes associées...
--
une bévue

9 réponses

Avatar
pere.noel
Une bévue wrote:


on m'a filé une page sur laquelle il y a les infos :
<http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileM
gmt/Tasks/ResolvingAliases.html>

mais je ne vois pas ce qu'il faut, en ruby, pour appeller ces classes et
leurs méthodes associées...


bon j'ai réalisé un petit pa en avant sur ce sujet...

la lecture de l'article cité + haut dit qu'il faut faire une conversion
:

URL -> FSRef

résoudre l'alias

conversion inverse :

FSRef' -> URL'

bon, j'en suis à chercher comment obtenir l'FSRef d'une URL...

peut-on le faire depuis CocoaRuby ???

pour le "OSX::NSFileManager.defaultManager" il y a bien la méthode :

fileSystemRepresentationWithPath

mais ça me retourne une String...

je patauge...

en pratique je ne vois pas sur quel receiver s'appliquent les méthodes :

CFURLCreateWithFileSystemPath(NULL /*allocator*/, (CFStringRef)path,

kCFURLPOSIXPathStyle, NO /*isDirectory*/);

et

CFURLRef resolvedUrl = CFURLCreateFromFSRef(NULL, &fsRef);

je dirais même +, je ne suis pas sûr que ce soit accessible depuis
CocoaRuby...
--
une bévue

Avatar
luc
Une bévue wrote:

en pratique je ne vois pas sur quel receiver s'appliquent les méthodes :

CFURLCreateWithFileSystemPath(NULL /*allocator*/, (CFStringRef)path,

kCFURLPOSIXPathStyle, NO /*isDirectory*/);

et

CFURLRef resolvedUrl = CFURLCreateFromFSRef(NULL, &fsRef);


Ce ne sont *pas* des méthodes. CF = CoreFoundation = procédural. Il
faudrait vraiment que tu révises certaines choses.

je dirais même +, je ne suis pas sûr que ce soit accessible depuis
CocoaRuby...


Ca m'étonnerait fort. On dirait qu'il faudrait que tu passes à autre
chose...

#!/usr/bin/env python
import Carbon.File
aliasPath = "/path/vers/un/alias"
resolved = Carbon.File.ResolveAliasFile(aliasPath, 1)
print resolved[0].as_pathname()

:)

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:

je dirais même +, je ne suis pas sûr que ce soit accessible depuis
CocoaRuby...


Ca m'étonnerait fort. On dirait qu'il faudrait que tu passes à autre
chose...

#!/usr/bin/env python
import Carbon.File
aliasPath = "/path/vers/un/alias"
resolved = Carbon.File.ResolveAliasFile(aliasPath, 1)
print resolved[0].as_pathname()

:)


amusant...

patpro m'a filé un script perl qui marche très bien (guère + rapide
qu'AppleScript)

bon, j'ai trouvé qqc en ObjC "BDAlias" là :
<http://bdistributed.com/Projects/BDAlias/>
cette classe a une méthode qui devrait faire ce que je veux :
- (NSString *)fullPath
Returns an autoreleased string containing
the full path of the object pointed to by an alias.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

MAIS ça me retourne le path de l'alias )))))

mon bout de code :
----------------------------------------------------------------------
OSX.ns_import('BDAlias')


f=OSX::BDAlias.alloc.initWithPath("/Users/yvon/work/RubyCocoa/MacSOUPSwi
tcher/map/read-alias/search/for/the/original/file/read-alias.pl")
p "f.class=#{f.class}"
# => "f.class=OSX::BDAlias"
p "f.fullPath=#{f.fullPath}"
# =>
"f.fullPath=/Users/yvon/work/RubyCocoa/MacSOUPSwitcher/map/read-alias/se
arch/for/the/original/file/read-alias.pl"
----------------------------------------------------------------------

et j'ai vérifié le code de BDAlias#fullPath il ressemble, à s'y
méprendre au code fourni par Apple à la page :
<http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileM
gmt/Tasks/ResolvingAliases.html>

conclusion : je ne pige pas où est le pb, j'ai du malcomprendre qqc ???
--
une bévue


Avatar
luc
Une bévue wrote:

conclusion : je ne pige pas où est le pb, j'ai du malcomprendre qqc ???


Oui. La classe BDAlias ne sert pas à "résoudre" des alias mais à en
créer de manière à disposer de références persistentes. C'est même
expliqué noir sur blanc dans la doc, dingue non ? :>

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:


Oui. La classe BDAlias ne sert pas à "résoudre" des alias mais à en
créer de manière à disposer de références persistentes. C'est même
expliqué noir sur blanc dans la doc, dingue non ? :>


oui, c'est ce qu'ils disent dans l'en-tête sur leur site mais dans le
fichier "BDAlias.rtf" :

- (NSString *)fullPath
Returns an autoreleased string containing the full path of the object
pointed to by an alias.

- (NSString *)fullPathRelativeToPath:(NSString *)relPath
Returns an autoreleased string containing the full path of the object
pointed to by an alias, resolved relative to the other given full path.

et le code suit assez exactement (pour la méthode
fullPathRelativeToPath:) ce qui est donné par Apple là :
<http://developer.apple.com/documentation/Cocoa/Conceptual/LowLevelFileM
gmt/Tasks/ResolvingAliases.html> et qui dit, entre-autre :

To resolve aliases in a path contained in an NSString, you need to
first convert the string to a URL, convert the URL to an FSRef,
resolve the alias, and reverse the series of conversions to
yield another NSString. To perform the necessary conversions,
you need to use the URL and alias services provided in
<CoreServices/CoreServices.h>. The following code fragment resolves
aliases in path, if present, and stores the resolved path in resolvedPath:


si tu as le temps jettes un oeil au code de :
BDAlias#fullPathRelativeToPath:(NSString *)relPath
et compare à la page Apple, c'est quasi identique.

mais bon je n'ai peut-être pas compris -- non plus -- ce que dit Apple
:[
--
une bévue

Avatar
luc
Une bévue wrote:

- (NSString *)fullPath
Returns an autoreleased string containing the full path of the object
pointed to by an alias.


Et cette methode d'instance est appliquée sur un objet crée avec quoi ?
Avec initWithPath qui 'initializes an alias object to point to the
object at the given path in the filesystem".

Tu as donc **crée** un alias qui pointe sur un truc quelconque, ce que
te retourne fullPath.

mais bon je n'ai peut-être pas compris -- non plus -- ce que dit Apple


Non, tu n'as pas compris à quoi sert BDAlias.

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:

Avec initWithPath qui 'initializes an alias object to point to the
object at the given path in the filesystem".
tu as lu ça où, je n'ai pas 7 phrase dans ma doc.


Tu as donc **crée** un alias qui pointe sur un truc quelconque, ce que
te retourne fullPath.


NON je n'ai pas créé un alias, je viens d'ailleurs d'essayer avec un
path bidon, qui ne correspond pas à un quelconque fichier/alias/dossier
:

f=OSX::BDAlias.alloc.initWithPath("/Users/yvon/Desktop/MonsieurBidochon"
)

ben là, XCode me donne un message d'erreur :
/Users/yvon/work/RubyCocoa/MacSOUPSwitcher/build/Development/MacSOUPSwit
cher.app/Contents/Resources/Alias_essai.rb:21: undefined method
`fullPath' for nil:NilClass (NoMethodError)

la ligne 22 étant :

p "f.fullPath=#{f.fullPath}"

là je trouve ça tout-à-fait normal, car l'alias n'existe pas, il faut
que l'alias ait une réalité "physique" pour qu'il soit résolu. c'est
pareil en applescript, mais plus malin car retourne "" quand l'alias est
broken...

mais bon je n'ai peut-être pas compris -- non plus -- ce que dit Apple


Non, tu n'as pas compris à quoi sert BDAlias.


ça c'est sûr qu'il y a des trucs de BDAlias dont je ne vois même pas
l'intérêt, donc effectivement là, je ne peux pas avoir compris.

MAIS ce dont je suis sûr c'est que le code de "#fullPathRelativeToPath:"
est pompé du code d'apple qui lui résoud les alias, je ne parle pas de
l'ensemble de la class BDAlias, uniquement cette méthode.
--
une bévue


Avatar
luc
Une bévue wrote:

tu as lu ça où, je n'ai pas 7 phrase dans ma doc.


BDAlias.rtf. Noir sur blanc.

NON je n'ai pas créé un alias


Si.

[[BDAlias alloc] initWithPath:@"/path/to/machin"];

crée un alias. Pas un truc physique sur le disque, un descripteur, une
référence en mémoire.

Tu as le code sous les yeux...

[BDAlias initWithPath:] -> [BDAlias initWithFSRef:] -> FSNewAlias ->
[BDAlias initWithAliasHandle:]

FSNewAlias: "Creates a new alias record, given a file system reference
(FSRef) to the target file or directory."

Ca peut pas être plus clair.

, je viens d'ailleurs d'essayer avec un
path bidon, qui ne correspond pas à un quelconque fichier/alias/dossier

f=OSX::BDAlias.alloc.initWithPath("/Users/yvon/Desktop/MonsieurBidochon"
)

ben là, XCode me donne un message d'erreur :
/Users/yvon/work/RubyCocoa/MacSOUPSwitcher/build/Development/MacSOUPSwit
cher.app/Contents/Resources/Alias_essai.rb:21: undefined method
`fullPath' for nil:NilClass (NoMethodError)

la ligne 22 étant :

p "f.fullPath=#{f.fullPath}"

là je trouve ça tout-à-fait normal, car l'alias n'existe pas


*NON*. C'est ce sur quoi tu pointes qui n'existe pas et c'est pour ça
que la *création* de l'alias foire et retourne nil, ce qui fait ensuite
foirer l'appel à fullPath.

MAIS ce dont je suis sûr c'est que le code de "#fullPathRelativeToPath:"
est pompé du code d'apple qui lui résoud les alias, je ne parle pas de
l'ensemble de la class BDAlias, uniquement cette méthode.


Dans ce cas là il sert à résoudre l'alias crée dans les methodes
initWithXXXX et aliasWithXXXX, pas à résoudre un alias "physique".

--
Luc Heinrich

Avatar
pere.noel
Luc Heinrich wrote:


Dans ce cas là il sert à résoudre l'alias crée dans les methodes
initWithXXXX et aliasWithXXXX, pas à résoudre un alias "physique".


oui, oui, je me suis complétement goraté...

quelqu'un m'a dit : il s'agit d'alias record et pas d'alias file...

bon, j'ai tjs le code apple, j'ai aussi un autre code trouvé sur le net,
j'ai essayé avec XCode : 9 erreurs de syntaxe,

bon je continue donc sur launchd et WatchPaths...

je reprendrais ce pb d'alias + tard ))
--
une bévue