2008-12-14 21:03:00 -05:00
|
|
|
! Copyright (C) 2008 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-10-15 01:12:11 -04:00
|
|
|
USING: accessors arrays assocs continuations deques dlists fry
|
|
|
|
io.backend io.directories io.files.info io.pathnames kernel
|
|
|
|
locals math sequences sorting system unicode.case vocabs.loader ;
|
2008-12-14 21:03:00 -05:00
|
|
|
IN: io.directories.search
|
|
|
|
|
2009-04-24 02:18:29 -04:00
|
|
|
: qualified-directory-entries ( path -- seq )
|
2009-10-28 18:25:50 -04:00
|
|
|
absolute-path
|
2009-10-15 01:12:11 -04:00
|
|
|
dup directory-entries [ [ append-path ] change-name ] with map ;
|
2009-04-24 02:18:29 -04:00
|
|
|
|
|
|
|
: qualified-directory-files ( path -- seq )
|
2009-10-28 18:25:50 -04:00
|
|
|
absolute-path
|
2009-04-24 02:18:29 -04:00
|
|
|
dup directory-files [ append-path ] with map ;
|
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: with-qualified-directory-files ( path quot -- )
|
|
|
|
'[ "" qualified-directory-files @ ] with-directory ; inline
|
|
|
|
|
|
|
|
: with-qualified-directory-entries ( path quot -- )
|
|
|
|
'[ "" qualified-directory-entries @ ] with-directory ; inline
|
|
|
|
|
2008-12-14 21:03:00 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-01-07 12:20:05 -05:00
|
|
|
TUPLE: directory-iterator path bfs queue ;
|
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: push-directory-entries ( path iter -- )
|
2009-04-24 17:24:31 -04:00
|
|
|
[ [ qualified-directory-entries ] [ 2drop f ] recover ] dip '[
|
2009-04-20 17:52:18 -04:00
|
|
|
_ [ queue>> ] [ bfs>> ] bi
|
2008-12-14 21:03:00 -05:00
|
|
|
[ push-front ] [ push-back ] if
|
2009-04-20 17:52:18 -04:00
|
|
|
] each ;
|
2008-12-14 21:03:00 -05:00
|
|
|
|
|
|
|
: <directory-iterator> ( path bfs? -- iterator )
|
|
|
|
<dlist> directory-iterator boa
|
2009-04-24 15:49:31 -04:00
|
|
|
dup path>> over push-directory-entries ;
|
2008-12-14 21:03:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: next-directory-entry ( iter -- directory-entry/f )
|
2008-12-14 21:03:00 -05:00
|
|
|
dup queue>> deque-empty? [ drop f ] [
|
2009-04-24 15:49:31 -04:00
|
|
|
dup queue>> pop-back
|
|
|
|
dup directory?
|
|
|
|
[ name>> over push-directory-entries next-directory-entry ]
|
|
|
|
[ nip ] if
|
2009-04-24 20:01:26 -04:00
|
|
|
] if ;
|
2009-04-24 15:49:31 -04:00
|
|
|
|
2010-03-09 03:56:07 -05:00
|
|
|
:: iterate-directory-entries ( ... iter quot: ( ... obj -- ... obj ) -- ... directory-entry/f )
|
2009-04-24 15:49:31 -04:00
|
|
|
iter next-directory-entry [
|
2009-04-24 20:01:26 -04:00
|
|
|
quot call
|
2009-04-24 16:22:12 -04:00
|
|
|
[ iter quot iterate-directory-entries ] unless*
|
2008-12-14 21:03:00 -05:00
|
|
|
] [
|
2009-04-20 17:52:18 -04:00
|
|
|
f
|
2008-12-14 21:03:00 -05:00
|
|
|
] if* ; inline recursive
|
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: iterate-directory ( iter quot -- path/f )
|
2009-04-24 20:01:26 -04:00
|
|
|
[ name>> ] prepose iterate-directory-entries ; inline
|
2009-04-24 15:49:31 -04:00
|
|
|
|
|
|
|
: setup-traversal ( path bfs quot -- iterator quot' )
|
2009-04-24 20:01:26 -04:00
|
|
|
[ <directory-iterator> ] dip [ f ] compose ; inline
|
2009-04-24 15:49:31 -04:00
|
|
|
|
2008-12-14 21:03:00 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: each-file ( path bfs? quot -- )
|
2009-04-24 20:01:26 -04:00
|
|
|
setup-traversal iterate-directory drop ; inline
|
2009-04-24 15:49:31 -04:00
|
|
|
|
|
|
|
: each-directory-entry ( path bfs? quot -- )
|
2009-04-24 20:01:26 -04:00
|
|
|
setup-traversal iterate-directory-entries drop ; inline
|
2008-12-14 21:03:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: recursive-directory-files ( path bfs? -- paths )
|
2010-01-22 16:00:53 -05:00
|
|
|
[ ] collector [ each-file ] dip ; inline
|
2009-01-07 12:20:05 -05:00
|
|
|
|
2009-04-24 20:01:26 -04:00
|
|
|
: recursive-directory-entries ( path bfs? -- directory-entries )
|
2010-01-22 16:00:53 -05:00
|
|
|
[ ] collector [ each-directory-entry ] dip ; inline
|
2009-04-24 15:49:31 -04:00
|
|
|
|
|
|
|
: find-file ( path bfs? quot -- path/f )
|
2009-04-24 17:24:31 -04:00
|
|
|
[ <directory-iterator> ] dip
|
2009-04-24 20:01:26 -04:00
|
|
|
[ keep and ] curry iterate-directory ; inline
|
2008-12-14 21:03:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: find-all-files ( path quot -- paths/f )
|
2010-01-22 16:00:53 -05:00
|
|
|
[ f <directory-iterator> ] dip selector
|
2009-04-24 20:01:26 -04:00
|
|
|
[ [ f ] compose iterate-directory drop ] dip ; inline
|
2009-04-24 15:49:31 -04:00
|
|
|
|
|
|
|
ERROR: file-not-found path bfs? quot ;
|
2008-12-14 21:03:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: find-file-throws ( path bfs? quot -- path )
|
2009-04-24 20:01:26 -04:00
|
|
|
3dup find-file dup [ 2nip nip ] [ drop file-not-found ] if ; inline
|
2009-02-20 13:12:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: find-in-directories ( directories bfs? quot -- path'/f )
|
2009-04-24 16:22:12 -04:00
|
|
|
'[ _ [ _ _ find-file-throws ] attempt-all ]
|
2009-04-24 20:01:26 -04:00
|
|
|
[ drop f ] recover ; inline
|
2008-12-14 21:03:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: find-all-in-directories ( directories quot -- paths/f )
|
2009-04-24 20:01:26 -04:00
|
|
|
'[ _ find-all-files ] map concat ; inline
|
2008-12-14 21:03:00 -05:00
|
|
|
|
2009-04-24 15:49:31 -04:00
|
|
|
: link-size/0 ( path -- n )
|
|
|
|
[ link-info size-on-disk>> ] [ 2drop 0 ] recover ;
|
2009-04-20 17:52:18 -04:00
|
|
|
|
|
|
|
: directory-size ( path -- n )
|
2009-04-24 15:49:31 -04:00
|
|
|
0 swap t [ link-size/0 + ] each-file ;
|
2009-04-20 20:01:33 -04:00
|
|
|
|
|
|
|
: path>usage ( directory-entry -- name size )
|
2009-04-24 15:49:31 -04:00
|
|
|
[ name>> dup ] [ directory? ] bi
|
|
|
|
[ directory-size ] [ link-size/0 ] if ;
|
2009-04-20 17:52:18 -04:00
|
|
|
|
2009-04-20 18:50:26 -04:00
|
|
|
: directory-usage ( path -- assoc )
|
2009-04-20 17:52:18 -04:00
|
|
|
[
|
2009-04-24 15:49:31 -04:00
|
|
|
[
|
|
|
|
[ path>usage ] [ drop name>> 0 ] recover
|
|
|
|
] { } map>assoc
|
2009-04-20 17:52:18 -04:00
|
|
|
] with-qualified-directory-entries sort-values ;
|
|
|
|
|
2009-05-10 20:20:04 -04:00
|
|
|
: find-by-extensions ( path extensions -- seq )
|
|
|
|
[ >lower ] map
|
|
|
|
'[ >lower _ [ tail? ] with any? ] find-all-files ;
|
|
|
|
|
|
|
|
: find-by-extension ( path extension -- seq )
|
|
|
|
1array find-by-extensions ;
|
|
|
|
|
2008-12-15 22:45:36 -05:00
|
|
|
os windows? [ "io.directories.search.windows" require ] when
|