guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Add "scandir" procedure


From: Ludovic Courtès
Subject: Re: [PATCH] Add "scandir" procedure
Date: Tue, 30 Aug 2011 18:06:39 +0200
User-agent: Gnus/5.110018 (No Gnus v0.18) Emacs/24.0.50 (gnu/linux)

Hi!

nalaginrut <address@hidden> skribis:

> I found there isn't "scandir" in current Guile. And we may use "ftw" to
> instead. I guess "ftw" traverse all sub-directoies. Yes, we may use nftw
> to filter the level we don't need, but "ftw" seems always traverse all
> sub-directories. If my guess is correct, I believe it's too slow for
> someone, for a instance, me. :-)

I was actually planning to push ‘file-system-fold’, a functional
alternative to ‘ftw’, which would be along the lines of this (from
<http://git.savannah.gnu.org/cgit/libchop.git/tree/utils/chop-backup#n46>):

  (define (file-system-fold enter? leaf down up skip init file-name)
    "Traverse the directory at FILE-NAME, recursively.  Enter sub-directories
  only when (ENTER? PATH STAT RESULT) returns true.  When a sub-directory is
  entered, call (DOWN PATH STAT RESULT), where PATH is the path of the
  sub-directory and STAT the result of (lstat PATH); when it is left, call (UP
  PATH STAT RESULT).  For each file in a directory, call (LEAF PATH STAT
  RESULT).  Return the result of these successive applications.  When ENTER?
  returns no, call (SKIP PATH STAT RESULT)."

    ...)

I think it would allow you to do what you want, right?  Like this:

  (define (directory-contents file-name)
    "Return the list of regular files and directories in the directory
  at FILE-NAME as a list of name/stat pairs."
    (file-system-fold (lambda (path stat result)         ; enter?
                        (eq? path file-name))
                      alist-cons                         ; leaf
                      (lambda (path stat result) result) ; down
                      (lambda (path stat result) result) ; up
                      alist-cons                         ; skip
                      '()
                      file-name))

What do you think?

Thanks,
Ludo’.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]