open System.IO
open System
open System.Diagnostics
let szPath = @"D:\Program Files\7-Zip\7z.exe"
let rootPath = @"Z:\bk"
let DFpath = @"D:\Project\iriszeri-hayate.visualstudio.com\Directory Flattener\Directory Flattener\Directory Flattener\bin\Release\Directory_Flattener.exe"
let LogSystem =
new MailboxProcessor<ConsoleColor * string>(fun x ->
let rec loop count =
async{
let! c,s = x.Receive()
Console.ForegroundColor <- c
Console.WriteLine s
return! loop (count + 1)
}
loop 0)
let LogRaw (e : string) = LogSystem.Post(ConsoleColor.DarkGray, e)
let Log (e : string) = LogSystem.Post(ConsoleColor.White,"[*] " + e)
let LogInfo (e : string) = LogSystem.Post(ConsoleColor.DarkGray,"[i] " + e)
let LogError (e : string) = LogSystem.Post(ConsoleColor.Red,"[!] " + e)
let (|>>) x f = f x; x
let Run = Async.Parallel >> Async.RunSynchronously >> ignore
let DoubleQuotes i = "\"" + i + "\""
let Argsize args = args |> String.concat " "
let LogInfoArgs = Argsize >> LogInfo
let LogInfoWithReturn e = e |>> LogInfo
let Caller path args rootPath =
let mutable StartInfo = new ProcessStartInfo()
StartInfo.FileName <- path
StartInfo.Arguments <- args
StartInfo.RedirectStandardError <- true
StartInfo.RedirectStandardOutput <- true
StartInfo.UseShellExecute <- false
StartInfo.WorkingDirectory <- rootPath
StartInfo.CreateNoWindow <- true
let cmd = new Process()
cmd.StartInfo <- StartInfo
cmd.OutputDataReceived.Add (fun e ->
match e.Data with
| msg when String.IsNullOrEmpty msg |> not -> LogRaw msg
| _ -> ())
cmd.EnableRaisingEvents <- true
cmd.Start() |> ignore
cmd.BeginOutputReadLine()
cmd.WaitForExit()
let ServeZip args = Caller szPath args rootPath
let DirectoryFlattener args = Caller DFpath args rootPath
let KoishiViewer _ =
Directory.EnumerateDirectories(rootPath)
|> Seq.map
(fun m ->
async{
let exPath = Path.Combine(m, "ex")
Directory.CreateDirectory exPath |> ignore
Log <| "move to " + exPath
Directory.EnumerateDirectories m
|> Seq.map
(fun p ->
async{
match Path.GetFileName(p) with
| "ex" -> ()
| name ->
let psPath = Path.Combine(m,"ex",name)
["move"; psPath; "to"; p] |> LogInfoArgs
Directory.Move(p,psPath)
})
|> Run
Log <| "Directory Flatten " + exPath
DirectoryFlattener exPath
Log <| "remove ps dir"
Directory.EnumerateDirectories(exPath)
|> Seq.iter (LogInfoWithReturn >> Directory.Delete)
Log <| "unzip " + m
Directory.EnumerateFiles m
|> Seq.iter
(fun x ->
if Path.GetExtension x = ".zip" then
LogInfo <| "unzip " + x
["x";
DoubleQuotes x;
"-o" + DoubleQuotes
(Path.Combine(exPath,Path.GetFileNameWithoutExtension x))]
|> Argsize
|> ServeZip
File.Delete x)
if Directory.EnumerateFileSystemEntries exPath |> Seq.length = 0 then
Directory.Delete(exPath)
})
|> Run
[<EntryPoint>]
let main _ =
LogSystem.Start()
KoishiViewer()
Log "done."
Console.ReadLine() |> ignore
0