Directory Entries


Quels sont Directory Entries?

Cette collection de procédures est distribuée sous termes de GPL. Elle est une tentative, écrite dans l'espoir de fournir des interfaces communes au système parmi des implantations vaiées pour la manipulation des noms de fichiers.

Scheme est tellement abstrait qu'il n'y a que de certaines interfaces limitées implantées. Il y a des procédures d'entrées/sorties standard telles que call-with-input-file ou open-input-file, faciles et puissantes á exploiter, mais il est délibérément confié aux implanteurs comment elles fonctionnent. Le manque de spécifications des interfaces au système a conduit à des définitions divers de procédures d'interface qui diffèrent suivant l'implantation. Les procédures standard entrées/sorties ne permettnt de traiter qu'un seul fichier à la fois.

J'ai essayé de fournir des manipulations des noms de fichier utilisant l'appel aux commandes système ls pour les unix et systèmes d'exploitation similaires, et dir pour Windows et OS/2. Les interfaces de SCM font l'exception car l'appel au système Windows par dir ne retroune pas les noms longs ni ceux avec espace tandis que les appels de SCM le font.

Les résultats d'execution de commandes sont pris par Scheme par la voie de PIPE ou d'un fichier temporaire si la fonction PIPE n'est pas disponible.

Dai Inukai (inukai.d@jeans.osn.ne.jp)

Limitations

Restrictions

Afin d'executer la commande ls ou dir à partir d'une implantation Scheme, la procédure SYSTEM doit être disponible. Par example, le mit-scheme pour OS/2 ne dispose pas de procédure system et l'empaquetage présent ne peut pas fonctionner. Cela me fâche car il n'y a aucune inconvénience pour l'inclure.

Pour les implantation non munies de la fontction PIPE, la voie est réalisée à l'aide d'un fichier temporaire. Le fichier temporaire étant effacé après l'execution de la command par la procédure delete-file, elle doit être également disponible. Sinon, elle doit être remplacée par l'appel à (system "rm TEMPORARY-FILE") ou à (system "del (or delte) TEMPORARY-FILE").

La procédure getcwd (ou pwd en cas de mit-scheme) est utilisée afin d'obtenir le répertoire courant. Elle doit être disponible aussi.

Le reste de cet empaquetage se conforme à r5rs, j'espère.

Des procédures de la bibliothèque SLIB, en plus, particulièrement celles de string-search, line-i/o, common-list-functions et glob sont utilisées et l'implantation est requise de pouvoir se servir d'elle. Ou les empaquetages "strsrch.scm", "lineio.scm" et ainsi du reste doivent être chargés chucun à l'avance.

Environnements Testés

Les procédures dans ce "direntry.scm" sont testées avec scm5d4, STk-4.0.1, guile-1.4 et mit-scheme-7.5.4 sur FreeBSD Release 4.2, avec scm5d4, STk-4.0.1 et guile-1.4 sur Linux (kernel 2.2r1), scm5d4 sur OS/2, Windows 98 et Windows 2000.

Procedures

Procedure: port->string-list vector-output?

L'argument booléen vector-output? est optionel. Retourne une procédure qui prend un argument, port d'entrée ouvert. La procédure retournee, un port d'entrée ouvert donné, retourne cett fois les lignes lues á partir du port comme liste si aucun argument ou #f est donné à vector-output?, ou comme vecteur si #t est donné à vector-output?.

Supposons que l'inport est lié à un fichier contenant les textes suivants:

aaa
bbb
ccc ddd
((port->string-list) inport)    => ("aaa" "bbb" "ccc ddd")
((port->string-list #t) inport) => #("aaa" "bbb" "ccc ddd")

Procedure: char-in-set? char charset

L'argument charset est optionel. La prédicative retourne #t si char est dans le charset sinon #f. Si l'argument charset est omis, l'ensemble de caractères est consigné à ceux pour lequels char-whitespace? retourne #t.

(char-in-set? #\space)           => #t
(char-in-set? #\newline)         => #t
(char-in-set? #\newline #\space) => #f
(char-in-set? #\, #\space #\,)   => #t

Procedure: decompose-string entry delimiters

Les delimiters sont optionels et signifient le même que pour les procédures char-in-set? et string-last-split. La procédure décompose la chaîne de caractères spécifiée à entry en les sous-chaînes séparées par les caractères spécifiés à l'argument delimiters, les caractères eux-mêmes étant exclus, en retourne la liste.

(decompose-string "This is a sample string.")
      => ("This" "is" "a" "sample" "string.")
(decompose-string "One, two, three and four are integers." 
                  #\space #\,)
      => ("One" "two" "three" "and" "four" "are" "integers.")
(decompose-string "One, two, three and four are integers." 
                  #\space #\, #\.)
      => ("One" "two" "three" "and" "four" "are" "integers")

Procedure: recompose-string prepend? string-list delimiters

La procédure retourne la chaîne de caractère concatenant les sous-chaînes données à la liste string-list séparée par les delimiters. L'argument booléen prepend? contrôle si les délimiteurs spécifiés sont mis avant les sous-chaînes ou après. Les delimiters sont optionels et spécifiés à #\space par défaut si omis. La recompose-string n'est pas exactement l'inverse de la decompose-string en ce que les delimiters sont specifiés en ordre d'ajout aux sous-chaînes string-list. Si le nombre de delimiters est plus de celui des éléments de string-list, ils sont tronqués au nombre d'éléments de string-list. Par contre le nombre de delimiters est augmenté en utilisant le dernier élément dans la liste de delimiters s'il est moins de celui de string-list.

(recompose-string #f '("This" "is" "a" "sample" "string."))
            => "This is a sample string."
(recompose-string #t '("This" "is" "a" "sample" "string."))
            => " This is a sample string."
(recompose-string #f '("This" "is" "a" "sample" "string.") #\,)
            => "This,is,a,sample,string."
(recompose-string #f '("direntry" "scm" "is" "to be" "required.") 
                        #\. #\space)
            => "direntry.scm is to be required."
(recompose-string #f '("A" "test" "string" "") #\space #\- #\.)
            => "A test-string."
(recompose-string #f '("A" "test" "string" " ") #\space #\- #\.)
            => "A test-string. "

Procedure: string-last-split string nth delimiters

Les delimiters sont optionels. La procédure retourne la liste cons dont le car est les sous-chaînes de caractères se terminant à la dernière occurrence de delimiters exclus, et le cdr est la liste de sous-chaînes commançant au caractère juste après la dernière occurrence de delimiters. L'argument nth contôle la longueur de la liste cdr. Si les delimiters ne sont pas donnés, ils sont ceux pour lesquels char-whitespace? retourne #t.

(string-last-split "This is a sample string." 1)  
                 => (("This" "is" "a" "sample")  "string.")
(string-last-split "A-little-brown-fox" 1 #\-)
                 => ("A" "little" "brown")  "fox")
(string-last-split "A-little-brown-fox" 2 #\-)
                 => (("A" "little") "brown" "fox")
(string-last-split "1, 2, 3 and 4" 1 #\, #\space) 
                 => (("1" "2" "3" "and") "4")
(string-last-split "This is a sample string." 0 #\,)
                 => (("This is a sample string."))
(string-last-split "This is a sample string." 3 #\,)
                 => (() "This is a sample string.")
(string-last-split "This is a sample string." 5 #\,)
                 => (()  "This is a sample string.")

Procedure: string-join-split consed-list

Crée une nouvelle liste de chaine de caractères à partir de la liste cons crée par la procédure string-last-split et la retourne.

(string-join-split (string-last-split "This is a sample string." 1))
                 => ("This" "is" "a" "sample" "string.")
(string-join-split (string-last-split "A-little-brown-fox" 2 #\-))
                 => ("A" "little" "brown" "fox")

Afin de recomposer la chaine originale, la procédure recompose-string est nécessaire.

(recompose-string #f 
                  (string-join-split 
                    (string-last-split "A-little-brown-fox" 2 #\-)) 
                  #\-)
                 => "A-little-brown-fox"

Procedure: call-with-input-pipe command-string proc

L'arguement Command-string est n'importe quelle chaine de caractères constituant la commande valable du système qui est passée à la procédure system. L'argument proc est une procédure acceptant un argument, port d'entrée ouvert. La procédure call-with-input-pipe execute la commande system avec l'arguement coomand-string, ouvre une pipe, passe l'autre extrémité de pipe à la procédure proc comme le port ouvert d'entrée, et ferme la pipe après l'execution de proc. La procédure retourne la valeur retournée par proc.

Supposons que le répertoire courant est "direntry":

(load "direntry.scm")
(call-with-input-pipe "ls ."
  (lambda (inport)
    (do ((l (read-line inport)(read-line inport)))
	((eof-object? l))
	(write-line l))))
ChangeLog
About
direntry.scm
direntry.texi
=> ;; retourne la valeur évaluée de l'expression do.

Procedure: is-directory? name-string

Retourne #t si la chaine de caractères donnée à l'arguement name-string est un répertoire sinon #f. La procédure retourne #f aussi si la chaine de caractères donnée à name-string n'existe pas dans le système de fichier.

(is-directory? ".")                       => #t
(is-directory? "./direntry")              => #t
(is-directory? "./direntry/direntry.scm") => #f
(is-directory? "/usr/local")              => #t

Procedure: directory-empty? name-string

Retourne #t si le nom du répertoire spécifié à l'argument name-string ne contient rien sinon #f.

(directory-empty? "/usr/local")           => #f

Procedure: dirent:scan-directory directories?

La procédure est appelée par directory-contains. L'arguement booléen directories? contrôle le balayage pour les répertoires si #t est spécifiés et pour les autres contenus si #f est spécifié. La procédure dirent:scan-directory retourne une procédure qui retourne les noms correspondant à la chaine de caractères spécifiée à son argument.

La procédure retrournée prend search-string, short-specs? et absolute? comme arguments. Les arguments short-specs? et absolute? sont optionels et consignés à #t par défaut si rien n'est spécifié. La procédure profitant de l'appel à ls (unix) ou à dir (ms-dos) par la chaine de commande à la procedure system, les détails de fichiers ou de répertoires sont retournés si short-specs? est #f. La voie absolue au fichier ou au répertoire est retourné si #t est spécifié à absolute?.

Le répertoire courant de "/usr/local/lib/slib/direntry" est supposé:

((dirent:scan-directory  #f) ".")
        => ("/usr/local/lib/slib/direntry/About" 
                   "/usr/local/lib/slib/direntry/COPYING" 
                   "/usr/local/lib/slib/direntry/ChangeLog" 
                   "/usr/local/lib/slib/direntry/direntry.info" 
                   "/usr/local/lib/slib/direntry/direntry.scm" 
                   "/usr/local/lib/slib/direntry/direntry.texi")
((dirent:scan-directory #f) "." #t #t)
        => ("/usr/local/lib/slib/direntry/About" 
                   "/usr/local/lib/slib/direntry/COPYING" 
                   "/usr/local/lib/slib/direntry/ChangeLog" 
                   "/usr/local/lib/slib/direntry/direntry.info" 
                   "/usr/local/lib/slib/direntry/direntry.scm" 
                   "/usr/local/lib/slib/direntry/direntry.texi")
((dirent:scan-directory #f) "." #t #f)
        => ("About" "COPYING" "ChangeLog" "direntry.info" 
                   "direntry.scm" "direntry.texi")
((dirent:scan-directory #t) "." #t #f)                            
        => ("." "..")
((dirent:scan-directory #t) "." #t #t)
        => ("/usr/local/lib/slib/direntry/." 
                   "/usr/local/lib/slib/direntry/..")
((dirent:scan-directory #t) "/usr/local/lib/slib" #f #f)
        => ("drwxr-xr-x 2 root wheel 512 3/21 05:00 direntry" 
                   "drwxr-xr-x 2 root wheel 512 3/27 05:03 jfilter" 
                   "drwxr-xr-x 2 root wheel 512 3/22 02:45 wb")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #t #f)
        => ("libm.so.2")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #t #t)
        => ("/usr/lib/libm.so.2")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #f #f)
        => ("-r--r--r-- 1 root wheel 118992 11/20 20:58 libm.so.2")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #f #t)
        => ("-r--r--r-- 1 root wheel 118992 11/20 20:58 
                   /usr/lib/libm.so.2")

Procedure: directory-contains directories? vector-output? short-specs? absolute? search-strings

Retourne les égaux correspondant aux spécifications de search-strings. Les répertoires sont retournés si #t est spécifié à directories? sinon les fichiers. La valeur est retournée comme vecteur si #t est spécifié à vector-output? ou comme liste si #f est spécifié.

Les arguments short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en ordre libre peuvent être spécifiés. La première valeur booléenne rencontrée est assignée à short-specs?, la deuxième à absolute?, et plus de deux arguments booléens sont ignorés. Des multiple chaine de caractères search-string peuvent être spécifiées ou l'argment search-strings peut être une chaine contenant plusieurs chaines séparées par #\space, qui sont transformées en liste de chaine et balayées une après l'autre par la procédure dirent:scan-directory.

Si rien est spécifié pour les arguments optionels, par defaut #t est consigné à short-specs?, #t à absolute? et le répertoire courant est balayé.

(directory-contains #f #f "/usr/lib/libm.*" "/usr/lib/libc.*" #t #f)
        => ("libc.a" "libc.so" "libc.so.4" "libm.a" "libm.so" 
                   "libm.so.2")
(directory-contains #f #f "/usr/lib/libm.* /usr/lib/libc.*" #t #f)
        => ("libc.a" "libc.so" "libc.so.4" "libm.a" "libm.so" 
                   "libm.so.2")
(directory-contains #f #f "/usr/lib/libm.*" #t #t)
        => ("/usr/lib/libm.a" "/usr/lib/libm.so" 
                   "/usr/lib/libm.so.2")
(directory-contains #f #f "/usr/lib/libm.*" #f #f)
        => ("-r--r--r-- 1 root wheel 118992 11/20 20:58 libm.so.2" 
                   "-r--r--r-- 1 root wheel 274862 11/20 20:58 libm.a" 
                   "lrwxrwxrwx 1 root wheel 9 2/ 9 09:43 libm.so 
                                                        -> libm.so.2")
(directory-contains #f #f "/usr/lib/libm.*" #f #t)
        => ("-r--r--r-- 1 root wheel 118992 11/20 20:58 
                    /usr/lib/libm.so.2" 
                   "-r--r--r-- 1 root wheel 274862 11/20 20:58 
                    /usr/lib/libm.a" 
                   "lrwxrwxrwx 1 root wheel 9 2/ 9 09:43 
                    /usr/lib/libm.so -> libm.so.2")

Les procédures files, files-v, dirs et dirs-v sont fournies comme raccourcis à la procédure directory-contains.

Procedure: files short-specs? absolute? search-strings

Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.

Retourne les noms de fichiers correspondants à search-strings en liste.

Procedure: files-v short-specs? absolute? search-strings

Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.

Retourne les noms de fichiers correspondants à search-strings en vecteur.

Procedure: dirs short-specs? absolute? search-strings

Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.

Retourne les noms de répertoires correspondant à search-strings en liste.

Procedure: dirs-v short-specs? absolute? search-strings

Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.

Retourne les noms de répertoires correspondant à search-strings en vecteur.

Procedure: directoryname-in-path pathname

Retourne les composants valables répertoire dans le pathname.

(directoryname-in-path "/usr/local/lib") 
        => "/usr/local/lib"
(directoryname-in-path "/usr/local/bin/scm")
        => "/usr/local/bin"
(directoryname-in-path "/usr/local/lib/non-existing-name")
        => "/usr/local/lib"
(directoryname-in-path "/usr/local/lib/slib/nclients.scm")
        => "/usr/local/lib/slib"
(directoryname-in-path ".")
        => "/usr/local/lib/slib/direntry"
        ;; current directory's path is returned.

Procedure: filename-in-path pathname

Retourne le nom de fichier dans le pathname. Si le pathname est un répertoire ou si le fihier n'existe pas, une chaine nulle est retournée.

(filename-in-path "/usr/local/lib/slib/nclients.scm")
        => "nclients.scm"
(filename-in-path "/usr/local/lib/slib")
        => ""
(filename-in-path "/usr/local/lib/non-existing-name")
        => ""

Procedure: basename-in-path pathname

Retourne le dernier composant de base dans la chaine même s'il est un répertoire ou si le fichier n'existe pas.

(basename-in-path "/usr/local/lib/slib/nclients.scm")
        => "nclients.scm"
(basename-in-path "/usr/local/lib/slib")
        => "slib"
(basename-in-path "/usr/local/lib/non-existing-name")
        => "non-existing-name"

Procedure: get-extension pathname updown

L'argument updown est optionel. La procédure retourne la dernière chaine de caractères après le point (.) dans le dernier composant de

updown is optional. The procedure returns the last string after pathname (extension), la conversion de casse étant effectuée suivant la spécification à l'argument updown. La chaine nulle est retournée si le dernier composant n'a pas d'extension.

Les spécifications à updown sont rien: pas de conversion effectuée, #t: conversion en bas de casse et #f conversion en haut de casse.

(get-extension "scm.EXE")      => "EXE"
(get-extension "scm.EXE" #t)   => "exe"
(get-extension "scm.exe" #f)   => "EXE"

Installation

Décompacter le "direntry.zip" dans le répertoire approprié, dans votre répertoire $HOME par example. Ceci crée un répertoire "$HOME/direntry" et y fait résider les archives.

Ajouter dans le fichier d'initialization de votre Scheme quelque ligne faisant le cons du nom du program au *catalog* SLIB.

unzip direntry.zip -d ~.
(require 'glob) ; Au cas où la variable  *catalog* n'est pas disponible.
(set! catalog
  (cons (cons 'directory-entries "your-home-directory/direntry") *catalog*))

Ou si vous trouvez cet empaquetage utile, récrire le programs mklibcat.scm sous le répertoire SLIB et recréer SLIBCAT en root.

*** mklibcat.scm.orig	Fri Mar 30 19:48:40 2001
--- mklibcat.scm	Wed Mar 21 05:21:58 2001
***************
*** 37,42 ****
--- 37,45 ----
  	    (cons 'portable-scheme-debugger
  		  (in-vicinity (sub-vicinity (library-vicinity) "psd")
  			       "psd-slib"))
+ 	    (cons 'directory-entries
+ 		  (in-vicinity (sub-vicinity (library-vicinity) "direntry")
+ 			       "direntry"))
  	    (cons 'jfilter
  		  (in-vicinity (sub-vicinity (library-vicinity) "jfilter")
  			       "jfilter")))

Après la récriture ci-dessus effectuée, émettre les code suivants encore en root.

(require 'new-catalog)
(require 'directory-entries)

Et un nouveau SLIBCAT est cré.

Jump to: e - l - q - r

e

  • Environnements Testés
  • l

  • Limitations
  • q

  • Quels sont Directory Entries?
  • r

  • restrinctions

  • This document was generated on 7 April 2001 using the texi2html translator version 1.52.