Rebol Programming/make-dir

From Wikibooks, open books for an open world
Jump to navigation Jump to search

USAGE:[edit | edit source]

MAKE-DIR path /deep 

DESCRIPTION:[edit | edit source]

Creates the specified directory. No error if already exists.

MAKE-DIR is a function value.

ARGUMENTS:[edit | edit source]

  • path -- (Type: file url)

REFINEMENTS:[edit | edit source]

  • /deep -- Create subdirectories too

(SPECIAL ATTRIBUTES)[edit | edit source]

  • catch

SOURCE CODE[edit | edit source]

make-dir: func [
    {Creates the specified directory. No error if already exists.} 
    [catch] 
    path [file! url!] 
    /deep "Create subdirectories too" 
    /local dirs end created
][
    if empty? path [return path] 
    if slash <> last path [path: dirize path] 
    if exists? path [
        if dir? path [return path] 
        return make error! reduce ['access 'cannot-open path]
    ] 
    if any [not deep url? path] [
        close throw-on-error [open/new path] 
        return path
    ] 
    path: copy path 
    dirs: copy [] 
    while [
        all [
            not empty? path 
            not exists? path 
            remove back tail path
        ]
    ] [
        end: any [find/last/tail path slash path] 
        insert dirs copy end 
        clear end
    ] 
    created: copy [] 
    foreach dir dirs [
        path: either empty? path [dir] [path/:dir] 
        append path slash 
        if error? try [make-dir path] [
            foreach dir created [attempt [delete dir]] 
            return make error! reduce ['access 'cannot-open path]
        ] 
        insert created path
    ] 
    path
]