io.directories: new utility word make-parent-directories, for making sure directories exists

locals-and-roots
Björn Lindqvist 2016-06-15 00:33:44 +02:00
parent 3eef76c686
commit ea4333e490
7 changed files with 25 additions and 21 deletions

View File

@ -17,7 +17,12 @@ HELP: cd
HELP: current-directory
{ $description "A variable holding the current directory as an absolute path. Words that use the filesystem do so in relation to this variable."
$nl
"This variable should never be set directly; instead, use " { $link set-current-directory } " or " { $link with-directory } ". This preserves the invariant that the value of this variable is an absolute path." } ;
"This variable should never be set directly; instead, use " { $link set-current-directory } " or " { $link with-directory } ". This preserves the invariant that the value of this variable is an absolute path." } ;
HELP: make-parent-directories
{ $values { "path" "a pathname string" } }
{ $description "Creates all parent directories of the path which do not yet exist." }
{ $errors "Throws an error if the directories could not be created." } ;
HELP: set-current-directory
{ $values { "path" "a pathname string" } }

View File

@ -158,6 +158,8 @@ io.launcher io.pathnames kernel sequences tools.test ;
[ "touch bar" try-output-process ] with-directory
] unit-test
{ t } [
"one/two/three" make-parent-directories parent-directory exists?
] unit-test
] with-test-directory

View File

@ -17,6 +17,8 @@ IN: io.directories
! Creating directories
HOOK: make-directory io-backend ( path -- )
DEFER: make-parent-directories
: make-directories ( path -- )
normalize-path trim-tail-separators dup {
[ "." = ]
@ -24,10 +26,13 @@ HOOK: make-directory io-backend ( path -- )
[ empty? ]
[ exists? ]
} 1|| [
dup parent-directory make-directories
make-parent-directories
dup make-directory
] unless drop ;
: make-parent-directories ( filename -- filename )
dup parent-directory make-directories ;
! Listing directories
TUPLE: directory-entry name type ;
@ -76,8 +81,7 @@ HOOK: move-file io-backend ( from to -- )
HOOK: copy-file io-backend ( from to -- )
M: object copy-file
dup parent-directory make-directories
binary <file-writer> [
make-parent-directories binary <file-writer> [
swap binary <file-reader> [
swap stream-copy
] with-disposal

View File

@ -37,7 +37,7 @@ M: windows delete-file ( path -- )
[ \ file-delete-failed boa rethrow ] recover ;
M: windows copy-file ( from to -- )
dup parent-directory make-directories
make-parent-directories
[ normalize-path ] bi@ 0 CopyFile win32-error=0/f ;
M: windows make-directory ( path -- )

View File

@ -18,7 +18,7 @@ IN: vocabs.metadata.resources
[ append-path ] curry bi@
dup file-info directory?
[ drop make-directories ]
[ swap [ parent-directory make-directories ] [ copy-file ] bi ] if ;
[ swap make-parent-directories copy-file ] if ;
PRIVATE>

View File

@ -1,11 +1,10 @@
! Copyright (C) 2014 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors alien.c-types alien.data alien.strings arrays
byte-arrays classes.struct combinators constructors
continuations destructors forestdb.ffi forestdb.paths fry
generalizations io.encodings.string io.encodings.utf8
io.pathnames kernel libc math multiline namespaces sequences
strings ;
USING: accessors alien.c-types alien.data alien.strings byte-arrays
classes.struct combinators constructors continuations destructors
forestdb.ffi fry generalizations io.directories io.encodings.string
io.encodings.utf8 io.pathnames kernel libc math multiline namespaces
sequences strings ;
QUALIFIED: sets
IN: forestdb.lib
@ -310,7 +309,7 @@ PRIVATE>
: fdb-open ( path config -- file-handle )
[ f void* <ref> ] 2dip
[ absolute-path ensure-fdb-filename-directory ] dip
[ make-parent-directories ] dip
[ fdb_open fdb-check-error ] 3keep
2drop void* deref <fdb-file-handle> ;

View File

@ -72,11 +72,5 @@ ERROR: not-a-string-number string ;
: path-fdb-duplicates ( path -- seq )
directory-files [ canonical-fdb-name ] map members ;
: ensure-fdb-directory ( filename -- filename )
[ make-directories ] keep ;
: ensure-fdb-filename-directory ( filename -- filename )
[ parent-directory make-directories ] keep ;
! : path>next-vnode-version-name ( path -- path' )
! [ file-name ]