Re: [AS] Remplacement de nom dans le Finder

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Daniel Varlet
Date:  
À: La liste AppleScript Francophone
Sujet: Re: [AS] Remplacement de nom dans le Finder
Le 14 avr. 08 à 10:03, Jill-Jênn VIE a écrit :
...
> (et un coucou à tous ceux qui se souviennent de moi)


Le plus dur ça a été d'oublier... ;-)
Un énorme salut à toi!

...
> Comment se fait-il que :
>
> tell application "Finder"
>     set jee to folder "jee" of desktop
>     repeat with i in jee
>         name of i
>     end repeat
> end tell
>
> me retourne quelque chose, tandis que :


Le plus rapide est la référence de forme "property of every
element" (là c'est l'application qui fait les boucles, et pas en
langage AS ;-)).
    
    tell application "Finder" to name of items of folder "jee" of desktop



Le 14 avr. 08 à 10:23, Jill-Jênn VIE a écrit :


> Bon ben comme on me répond vite, j'en profite ;-)
>
> tell application "Finder"
>     set jee to folder "jee" of desktop
>     set liste to {}
>     repeat with i in jee
>         if name of i ends with "b.png" then
>             set name of i to "p" & (name of i)
>         end if
>     end repeat
> end tell
>
> Comment se fait-il qu'à l'issue de l'exécution de ce bout de code,
> j'obtiens des fichiers commençant par plusieurs p ?
>
> En fait, en lisant ton dernier message, Patrick, peut-être que c'est
> parce que la liste change, du coup il reprend plusieurs fois le même
> élément...


Comme ça fait au moins deux fois que tu poses la question de fond,
voici un essai d'analyse/explication de ces mystères.

Il suffit de regarder les références renvoyées, et tout s'éclaire.

Je pourrais m'arrêter là, mais j'ai peur que ce soit un peu trop
"Delphic"... ;-)



tell application "Finder"
    set jee to folder "jee" of desktop
    repeat with i in jee
        return i
    end repeat
end tell

--> item 1 of folder "jee" of folder "Desktop" of etc...

À chaque tour de boucle c'est l'item <index incrémenté> (que j'appelle
n) du dossier qui est renvoyé.
Et ce dossier peut être modifié à tous moments. C'est bien ce dont tu
avais l'intuition.
Quand tu modifies le nom d'un fichier, le fichier change de place dans
l'ordre du dossier (tri par nom ou par date de modif, ou par choix
utilisateur, j'ai la flemme de regarder).
item n du dossier ne renvoie plus le même fichier.
C'est donc "dangereux" si on ne sait pas ce qui se passe.
De plus des erreurs surviendront si on supprime des fichiers pendant
la boucle.

Il faut, pour comprendre, essayer d'imaginer dans les grandes lignes
(je n'ai pas le code source AS) ce que fait cette forme particulière
de boucle, le 'repeat in'.
Tout d'abord le nombre d'itérations à faire est fixé en début.
'repeat in' demande d'abord "count of objet" pour connaître le nombre
de tours à faire.
L'objet doit donc pouvoir répondre au message "count", sinon erreur.
On en déduit très astucieusement que l’objet n'est donc pas
obligatoirement une classe list.
Si l'objet renvoie un résultat valide, alors 'repeat' se met à tourner
en fabriquant à chaque fois une référence simpliste: item n of objet
qu'il met dans la variable utilisateur donnée (i dans ton exemple).
C'est aussi primitif que ça.
Autre déduction: l'objet doit répondre à index n. Ce qui est le cas de
plusieurs classes du Finder.

Quand l'objet référencé peut-être modifié en cours de boucle, c'est
donc risqué. La cata c'est si le "count" des éléments varie. index n
risque de ne plus exister. Exemple: suppression de fichiers dans un
dossier.

Un style de référence moins "dangereux".

tell application "Finder"
    set jee to folder "jee" of desktop
    repeat with i in (get items of jee)
        return i
    end repeat
end tell

--> item 1 of { document file "index 1.html" of folder "jee" of folder
"Desktop"of etc..., document file "index 2.html" of folder "jee" of
etc.., etc...}

Là, la référence est fixe et les références aux éléments contenus
assez précises. Il n'y aura plus ce genre de problèmes.

Ce n'est pas propre au Finder. Cela vient simplement du choix de
l'objet à énumérer.

Un exemple avec un objet différent: une classe réfence AS qui
référence une liste.
Cet objet répondra bien à count et à index n.

set xs to {1, 2, 3}
set jee to a reference to xs
repeat with i in jee
    set xs to {i, 8}
    try
        contents of i
    on error ert
        log ert --> ""Il est impossible d’obtenir item 3 of {item 3 of xs,
8}."
    end try
end repeat

Il y certainement d'autres exemples.

A+


-- 
Daniel


_______________________________________________
Applescript_fr mailing list
Applescript_fr@???
http://listes.patpro.net/mailman/listinfo/applescript_fr