Directory Walker

Directory Walker

open System
open System.IO
open Microsoft.WindowsAPICodePack.Dialogs

let (|>>) x f = f x ; x

let DirectoryPick _ =
    let dialog = new CommonOpenFileDialog()
    dialog.IsFolderPicker <- true
    match dialog.ShowDialog() with
    | CommonFileDialogResult.Ok -> dialog.FileName
    | _ -> String.Empty

let rec getAllFiles dir =
    seq { yield! try 
                    Directory.EnumerateFiles(dir, "*.*") 
                 with 
                 | _ -> Seq.empty
          for d in (try 
                    Directory.EnumerateDirectories(dir) 
                    with 
                    | _ -> Seq.empty) do
              yield! getAllFiles d }

let DirectoryWalk path =
    path
    |> getAllFiles 
    |> Seq.map ( fun x -> 
        (x + "    " 
        |>> Console.Write) 
        |> (fun y -> 
            try 
                (new FileInfo(y)).Length 
                |>> Console.WriteLine 
            with 
            | _ -> 0L)) 
        |> Seq.reduce (+) 
        |> (fun x -> 
            (((double)x / 1024. / 1024. / 1024.) 
            |> Convert.ToString) + " GB" 
            |> Console.WriteLine)
    Console.ReadLine() |> ignore

[<STAThread>]
[<EntryPoint>]
let main argv =
    match argv.Length with
    | 0 -> DirectoryPick()
    | _ -> argv.[0]
    |> DirectoryWalk
    0

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注