3 people like it.
Like the snippet!
Tree walker
creates folder and file structure on the file system based on a tree output.
Given a file generated from tree /f /a > file.txt it creates the structure on a given folder
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
|
open System.IO
open System.Text.RegularExpressions
let readlines (path:string) =
let generator (reader:StreamReader) =
match reader.ReadLine() with
| null -> None
| str -> Some (str, reader)
let reader = new StreamReader(path)
Seq.unfold generator reader
let touch path = File.Create(path).Close()
let up path = Path.GetFullPath(Path.Combine(path, ".."))
let upx x path = [1..x] |> List.fold (fun p _ -> up p) path
let mkdir current folder =
let path = Path.Combine(current, folder)
Directory.CreateDirectory(path) |> ignore
path
let parse line =
let re = new Regex(@"^(?<blanks>\|\s*)*((?<kind>\\|\+)---)?\s*(?<path>.*)$")
let m = re.Match(line)
if m.Success then
let count = m.Groups.["blanks"].Captures.Count
let kind = m.Groups.["kind"].Value
let path = m.Groups.["path"].Value
Some (count, kind, path)
else None
let (|Out|File|Folder|) line =
match parse line with
| Some (count, "", "") -> Out count
| Some (count, "\\", path) -> Folder (count + 1, path)
| Some (count, "+", path) -> Folder (count, path)
| Some (count, "", path) -> File path
| _ -> failwith <| sprintf "error parsing line %s" line
let traverse path lines =
let folder (depth,path) line =
match line with
| Out count -> (count, upx (depth - count) path)
| File file ->
touch <| Path.Combine(path, file)
(depth, path)
| Folder (d, folder) -> (d + 1, mkdir path folder)
lines
|> Seq.fold folder (0, path)
|> ignore
let doit tree target =
readlines tree
|> Seq.skip 3
|> traverse target
|
namespace System
namespace System.IO
namespace System.Text
namespace System.Text.RegularExpressions
val readlines : path:string -> seq<string>
Full name: Script.readlines
val path : string
Multiple items
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = System.String
Full name: Microsoft.FSharp.Core.string
val generator : (StreamReader -> (string * StreamReader) option)
val reader : StreamReader
Multiple items
type StreamReader =
inherit TextReader
new : stream:Stream -> StreamReader + 9 overloads
member BaseStream : Stream
member Close : unit -> unit
member CurrentEncoding : Encoding
member DiscardBufferedData : unit -> unit
member EndOfStream : bool
member Peek : unit -> int
member Read : unit -> int + 1 overload
member ReadLine : unit -> string
member ReadToEnd : unit -> string
...
Full name: System.IO.StreamReader
--------------------
StreamReader(stream: Stream) : unit
StreamReader(path: string) : unit
StreamReader(stream: Stream, detectEncodingFromByteOrderMarks: bool) : unit
StreamReader(stream: Stream, encoding: System.Text.Encoding) : unit
StreamReader(path: string, detectEncodingFromByteOrderMarks: bool) : unit
StreamReader(path: string, encoding: System.Text.Encoding) : unit
StreamReader(stream: Stream, encoding: System.Text.Encoding, detectEncodingFromByteOrderMarks: bool) : unit
StreamReader(path: string, encoding: System.Text.Encoding, detectEncodingFromByteOrderMarks: bool) : unit
StreamReader(stream: Stream, encoding: System.Text.Encoding, detectEncodingFromByteOrderMarks: bool, bufferSize: int) : unit
StreamReader(path: string, encoding: System.Text.Encoding, detectEncodingFromByteOrderMarks: bool, bufferSize: int) : unit
StreamReader.ReadLine() : string
union case Option.None: Option<'T>
val str : string
union case Option.Some: Value: 'T -> Option<'T>
module Seq
from Microsoft.FSharp.Collections
val unfold : generator:('State -> ('T * 'State) option) -> state:'State -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.unfold
val touch : path:string -> unit
Full name: Script.touch
type File =
static member AppendAllLines : path:string * contents:IEnumerable<string> -> unit + 1 overload
static member AppendAllText : path:string * contents:string -> unit + 1 overload
static member AppendText : path:string -> StreamWriter
static member Copy : sourceFileName:string * destFileName:string -> unit + 1 overload
static member Create : path:string -> FileStream + 3 overloads
static member CreateText : path:string -> StreamWriter
static member Decrypt : path:string -> unit
static member Delete : path:string -> unit
static member Encrypt : path:string -> unit
static member Exists : path:string -> bool
...
Full name: System.IO.File
File.Create(path: string) : FileStream
File.Create(path: string, bufferSize: int) : FileStream
File.Create(path: string, bufferSize: int, options: FileOptions) : FileStream
File.Create(path: string, bufferSize: int, options: FileOptions, fileSecurity: System.Security.AccessControl.FileSecurity) : FileStream
val up : path:string -> string
Full name: Script.up
type Path =
static val DirectorySeparatorChar : char
static val AltDirectorySeparatorChar : char
static val VolumeSeparatorChar : char
static val InvalidPathChars : char[]
static val PathSeparator : char
static member ChangeExtension : path:string * extension:string -> string
static member Combine : [<ParamArray>] paths:string[] -> string + 3 overloads
static member GetDirectoryName : path:string -> string
static member GetExtension : path:string -> string
static member GetFileName : path:string -> string
...
Full name: System.IO.Path
Path.GetFullPath(path: string) : string
Path.Combine([<System.ParamArray>] paths: string []) : string
Path.Combine(path1: string, path2: string) : string
Path.Combine(path1: string, path2: string, path3: string) : string
Path.Combine(path1: string, path2: string, path3: string, path4: string) : string
val upx : x:int -> path:string -> string
Full name: Script.upx
val x : int
Multiple items
module List
from Microsoft.FSharp.Collections
--------------------
type List<'T> =
| ( [] )
| ( :: ) of Head: 'T * Tail: 'T list
interface IEnumerable
interface IEnumerable<'T>
member Head : 'T
member IsEmpty : bool
member Item : index:int -> 'T with get
member Length : int
member Tail : 'T list
static member Cons : head:'T * tail:'T list -> 'T list
static member Empty : 'T list
Full name: Microsoft.FSharp.Collections.List<_>
val fold : folder:('State -> 'T -> 'State) -> state:'State -> list:'T list -> 'State
Full name: Microsoft.FSharp.Collections.List.fold
val p : string
val mkdir : current:string -> folder:string -> string
Full name: Script.mkdir
val current : string
val folder : string
type Directory =
static member CreateDirectory : path:string -> DirectoryInfo + 1 overload
static member Delete : path:string -> unit + 1 overload
static member EnumerateDirectories : path:string -> IEnumerable<string> + 2 overloads
static member EnumerateFileSystemEntries : path:string -> IEnumerable<string> + 2 overloads
static member EnumerateFiles : path:string -> IEnumerable<string> + 2 overloads
static member Exists : path:string -> bool
static member GetAccessControl : path:string -> DirectorySecurity + 1 overload
static member GetCreationTime : path:string -> DateTime
static member GetCreationTimeUtc : path:string -> DateTime
static member GetCurrentDirectory : unit -> string
...
Full name: System.IO.Directory
Directory.CreateDirectory(path: string) : DirectoryInfo
Directory.CreateDirectory(path: string, directorySecurity: System.Security.AccessControl.DirectorySecurity) : DirectoryInfo
val ignore : value:'T -> unit
Full name: Microsoft.FSharp.Core.Operators.ignore
val parse : line:string -> (int * string * string) option
Full name: Script.parse
val line : string
val re : Regex
Multiple items
type Regex =
new : pattern:string -> Regex + 1 overload
member GetGroupNames : unit -> string[]
member GetGroupNumbers : unit -> int[]
member GroupNameFromNumber : i:int -> string
member GroupNumberFromName : name:string -> int
member IsMatch : input:string -> bool + 1 overload
member Match : input:string -> Match + 2 overloads
member Matches : input:string -> MatchCollection + 1 overload
member Options : RegexOptions
member Replace : input:string * replacement:string -> string + 5 overloads
...
Full name: System.Text.RegularExpressions.Regex
--------------------
Regex(pattern: string) : unit
Regex(pattern: string, options: RegexOptions) : unit
val m : Match
Regex.Match(input: string) : Match
Regex.Match(input: string, startat: int) : Match
Regex.Match(input: string, beginning: int, length: int) : Match
property Group.Success: bool
val count : int
property Match.Groups: GroupCollection
val kind : string
val failwith : message:string -> 'T
Full name: Microsoft.FSharp.Core.Operators.failwith
val sprintf : format:Printf.StringFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.sprintf
val traverse : path:string -> lines:seq<string> -> unit
Full name: Script.traverse
val lines : seq<string>
val folder : (int * string -> string -> int * string)
val depth : int
active recognizer Out: string -> Choice<int,string,(int * string)>
Full name: Script.( |Out|File|Folder| )
Multiple items
active recognizer File: string -> Choice<int,string,(int * string)>
Full name: Script.( |Out|File|Folder| )
--------------------
type File =
static member AppendAllLines : path:string * contents:IEnumerable<string> -> unit + 1 overload
static member AppendAllText : path:string * contents:string -> unit + 1 overload
static member AppendText : path:string -> StreamWriter
static member Copy : sourceFileName:string * destFileName:string -> unit + 1 overload
static member Create : path:string -> FileStream + 3 overloads
static member CreateText : path:string -> StreamWriter
static member Decrypt : path:string -> unit
static member Delete : path:string -> unit
static member Encrypt : path:string -> unit
static member Exists : path:string -> bool
...
Full name: System.IO.File
val file : string
active recognizer Folder: string -> Choice<int,string,(int * string)>
Full name: Script.( |Out|File|Folder| )
val d : int
val fold : folder:('State -> 'T -> 'State) -> state:'State -> source:seq<'T> -> 'State
Full name: Microsoft.FSharp.Collections.Seq.fold
val doit : tree:string -> target:string -> unit
Full name: Script.doit
val tree : string
val target : string
val skip : count:int -> source:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.skip
More information