;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME:find ; ; PURPOSE:similaire a la commance unix find. On donne un nom de ; fichier et en retour la fonction renvoie le nom du fichier entier ; (avec tous les repertoires) si le fichier existe dans un des ; repertoires definit par !path. Dans le cas contraire la function ; renvoie 'NOT FOUND' ; ; CATEGORY:trouver un fichier ; ; CALLING SEQUENCE: nom_entier=find('nom_fichier') ; ; INPUTS: ; nom_fichier: un string contenant le nom du fichier. Si ce ; fichier ne contient pas une extension (.bidule) on essaie de ; chercher un fichier nom_fichier.pro. Ce string peut contenir le ; caractere * qui, comme sous unix, remplace n''importe quelle chaine ; de charactere. ; ; KEYWORD PARAMETERS: ; REPERTOIRE: activer ce mot cle si on veut que find donne ; uniquement les differents repertoires ou on peut trouver le ; fichier ; ; NOPRO: activer si on ne veut pas que nom_fichier soit complete ; automatiquement par .pro si il ne contient pas d''extension ; ; OUTPUTS: ; nom_entier: un string ou un vecteur de string. il contient le ; nom entier du fichier avec tout le chemin depuis le debut de ; l''arborescence. Si plusieurs fichiers sont trouves (dans ; differents repertoires ou lors de l''utilisation de *) ; nom_entier est un vecteur dont chacun de ses elements est une ; solution possible. Si Le fichier n''est pas trouve nom_entier ; est egale a 'NOT FOUND'. ; ; COMMON BLOCKS: none ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; IDL> print, find('*loadct') ; /local/idl/lib/loadct.pro /local/idl/lib/xloadct.pro ; IDL> print, find('toto') ; NOT FOUND ; IDL> print, find('find') ; /home/1997001/smasso01/IDL_RD/find.pro ; IDL> print, find('l*',/rep) ; /home/1997001/smasso01/IDL_RD/ /local/idl/lib/ /local/idl/lib/obsolete/ ; ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) ; 28/4/1999 ; 6/7/1999: compatibilite mac et windows ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ FUNCTION find, nomfichier, REPERTOIRE = repertoire, NOPRO = nopro nomfich = nomfichier ; il faut completer le nom par .pro??? if NOT keyword_set(nopro) THEN $ if strpos(nomfich,'.') EQ -1 then nomfich=nomfich+".pro" ; on cree tous les noms entiers possibles avec les repertoires ; contenus dans !path thisOS = strupcase(strmid(!version.os_family, 0, 3)) CASE thisOS of 'MAC':BEGIN & sep = ':' & pathsep = ',' & end 'WIN':BEGIN & sep = '\' & pathsep = ';' & end ELSE: BEGIN & sep = '/' & pathsep = ':' & end ENDCASE cd, current = current if strpos(nomfich,sep) lt 0 then BEGIN if rstrpos(current,sep) NE strlen(current)-1 then current = current+sep multipath = str_sep(!path,pathsep) if rstrpos(multipath[0],sep) NE strlen(multipath[0])-1 then multipath = multipath +sep nomfich = [current, multipath]+ nomfich ENDIF ; on test tous les noms possibles pour trouver ou est le fichier res = [' '] for n = 0, n_elements(nomfich)-1 do BEGIN tmp = findfile(nomfich[n]) if tmp[0] NE '' then res = [res, tmp] ENDFOR if n_elements(res) EQ 1 then return, 'NOT FOUND' ELSE BEGIN res = res[1:n_elements(res)-1] IF keyword_set(repertoire) then BEGIN ; on extrait le nom des repertoires for i = 0,n_elements(res)-1 do res[i] = strmid(res[i], 0, rstrpos(res[i],sep)+1) ; on supprime les repertoires en double res = res[uniq(res, sort(res))] ENDIF return, res ENDELSE end