1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-22 03:30:22 +02:00

ftw: Add an optional stat' parameter to file-system-fold' and `-tree'.

* module/ice-9/ftw.scm (file-system-fold): Add an optional `stat'
  parameter.  Use it instead of `lstat'.  Handle the case where (STAT child)
  fails.
  (file-system-tree): Likewise, and pass it to `file-system-fold'.

* doc/ref/misc-modules.texi (File Tree Walk): Update the documentation
  of these functions.
This commit is contained in:
Ludovic Courtès 2011-12-15 23:32:24 +01:00
parent ed4c373966
commit af98fafabf
2 changed files with 35 additions and 22 deletions

View file

@ -1098,6 +1098,9 @@ try to use one of them. The reason for two versions is that the full
@section File Tree Walk
@cindex file tree walk
@cindex file system traversal
@cindex directory traversal
The functions in this section traverse a tree of files and
directories. They come in two flavors: the first one is a high-level
functional interface, and the second one is similar to the C @code{ftw}
@ -1109,9 +1112,9 @@ GNU C Library Reference Manual}).
@end example
@sp 1
@defun file-system-tree file-name [enter?]
@defun file-system-tree file-name [enter? [stat]]
Return a tree of the form @code{(@var{file-name} @var{stat}
@var{children} ...)} where @var{stat} is the result of @code{(lstat
@var{children} ...)} where @var{stat} is the result of @code{(@var{stat}
@var{file-name})} and @var{children} are similar structures for each
file contained in @var{file-name} when it designates a directory.
@ -1121,6 +1124,9 @@ directory @var{name}; the default value is a procedure that always
returns @code{#t}. When a directory does not match @var{enter?}, it
nonetheless appears in the resulting tree, only with zero children.
The @var{stat} argument is optional and defaults to @code{lstat}, as for
@code{file-system-fold} (see below.)
The example below shows how to obtain a hierarchical listing of the
files under the @file{module/language} directory in the Guile source
tree, discarding their @code{stat} info:
@ -1174,7 +1180,7 @@ than building up a tree of entries in memory, like
directly as a directory tree is traversed; in fact,
@code{file-system-tree} is implemented in terms of it.
@defun file-system-fold enter? leaf down up skip init file-name
@defun file-system-fold enter? leaf down up skip init file-name [stat]
Traverse the directory at @var{file-name}, recursively, and return the
result of the successive applications of the @var{leaf}, @var{down},
@var{up}, and @var{skip} procedures as described below.
@ -1183,7 +1189,7 @@ Enter sub-directories only when @code{(@var{enter?} @var{path}
@var{stat} @var{result})} returns true. When a sub-directory is
entered, call @code{(@var{down} @var{path} @var{stat} @var{result})},
where @var{path} is the path of the sub-directory and @var{stat} the
result of @code{(false-if-exception (lstat @var{path}))}; when it is
result of @code{(false-if-exception (@var{stat} @var{path}))}; when it is
left, call @code{(@var{up} @var{path} @var{stat} @var{result})}.
For each file in a directory, call @code{(@var{leaf} @var{path}
@ -1203,6 +1209,11 @@ file name, then @var{path} is also an absolute file name. Files and
directories, as identified by their device/inode number pair, are
traversed only once.
The optional @var{stat} argument defaults to @code{lstat}, which means
that symbolic links are not followed; the @code{stat} procedure can be
used instead when symbolic links are to be followed (@pxref{File System,
stat}).
The example below illustrates the use of @code{file-system-fold}:
@example