]> gitweb.factorcode.org Git - factor.git/blob - basis/io/directories/directories.factor
io.directories: add "directory-tree-files" and "with-directory-tree-files" words
[factor.git] / basis / io / directories / directories.factor
1 ! Copyright (C) 2004, 2008 Slava Pestov, Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays combinators destructors io io.backend
4 io.encodings.binary io.files io.files.types io.pathnames
5 kernel namespaces sequences system vocabs.loader fry ;
6 IN: io.directories
7
8 : set-current-directory ( path -- )
9     absolute-path current-directory set ;
10
11 : with-directory ( path quot -- )
12     [ absolute-path current-directory ] dip with-variable ; inline
13
14 ! Creating directories
15 HOOK: make-directory io-backend ( path -- )
16
17 : make-directories ( path -- )
18     normalize-path trim-tail-separators {
19         { [ dup "." = ] [ ] }
20         { [ dup root-directory? ] [ ] }
21         { [ dup empty? ] [ ] }
22         { [ dup exists? ] [ ] }
23         [
24             dup parent-directory make-directories
25             dup make-directory
26         ]
27     } cond drop ;
28
29 ! Listing directories
30 TUPLE: directory-entry name type ;
31
32 HOOK: >directory-entry os ( byte-array -- directory-entry )
33
34 HOOK: (directory-entries) os ( path -- seq )
35
36 : directory-entries ( path -- seq )
37     normalize-path
38     (directory-entries)
39     [ name>> { "." ".." } member? not ] filter ;
40     
41 : directory-files ( path -- seq )
42     directory-entries [ name>> ] map ;
43
44 : directory-tree-files ( path -- seq )
45     dup directory-entries
46     [
47         dup type>> +directory+ =
48         [ name>> [ append-path directory-tree-files ] [ [ prepend-path ] curry map ] bi ]
49         [ nip name>> 1array ] if
50     ] with map concat ;
51
52 : with-directory-entries ( path quot -- )
53     '[ "" directory-entries @ ] with-directory ; inline
54
55 : with-directory-files ( path quot -- )
56     '[ "" directory-files @ ] with-directory ; inline
57
58 : with-directory-tree-files ( path quot -- )
59     '[ "" directory-tree-files @ ] with-directory ; inline
60
61 ! Touching files
62 HOOK: touch-file io-backend ( path -- )
63
64 ! Deleting files
65 HOOK: delete-file io-backend ( path -- )
66
67 HOOK: delete-directory io-backend ( path -- )
68
69 : to-directory ( from to -- from to' )
70     over file-name append-path ;
71
72 ! Moving and renaming files
73 HOOK: move-file io-backend ( from to -- )
74
75 : move-file-into ( from to -- )
76     to-directory move-file ;
77
78 : move-files-into ( files to -- )
79     '[ _ move-file-into ] each ;
80
81 ! Copying files
82 HOOK: copy-file io-backend ( from to -- )
83
84 M: object copy-file
85     dup parent-directory make-directories
86     binary <file-writer> [
87         swap binary <file-reader> [
88             swap stream-copy
89         ] with-disposal
90     ] with-disposal ;
91
92 : copy-file-into ( from to -- )
93     to-directory copy-file ;
94
95 : copy-files-into ( files to -- )
96     '[ _ copy-file-into ] each ;
97
98 {
99     { [ os unix? ] [ "io.directories.unix" require ] }
100     { [ os windows? ] [ "io.directories.windows" require ] }
101 } cond