open System.Diagnostics open System open System.IO open System.Windows.Forms let AppPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase let DataPath = AppPath + "Data\\" let BatPath = DataPath + "QiniuDirectoryUpload.bat" let QshellFilename = "qshell-windows-x64.exe" let Input (tips : string) = Console.Write tips Console.ReadLine() let (|>>) x f = f x; x let DoubleQuotes i = "\"" + i + "\"" let GetTime _ = DateTime.Now.ToLocalTime().ToString("u").Replace(" ", "").Replace("-", "").Replace(":", "").Replace("Z", "") let SystemRaw (command : string) visible = let mutable Output = String.Empty let sw = new StreamWriter(BatPath) sw.Write command sw.Close() let mutable StartInfo = new ProcessStartInfo() StartInfo.FileName <- BatPath StartInfo.Arguments <- "2>&1" StartInfo.RedirectStandardError <- true StartInfo.RedirectStandardOutput <- true StartInfo.UseShellExecute <- false StartInfo.WorkingDirectory <- DataPath StartInfo.CreateNoWindow <- true let cmd = new Process() cmd.StartInfo <- StartInfo cmd.OutputDataReceived.Add (fun e -> if String.IsNullOrEmpty e.Data <> true then if visible then if not <| e.Data.Contains AppPath then "[*] " + e.Data |> Console.WriteLine Output <- Output + "\n" + e.Data) cmd.EnableRaisingEvents <- true cmd.Start() |> ignore cmd.BeginOutputReadLine() cmd.WaitForExit() Output let System command = SystemRaw command true let SystemInvisible command = SystemRaw command false let Qshell command = QshellFilename + " " + command |> System let QshellInvisible command = QshellFilename + " " + command |> SystemInvisible let GetBuckets _ = let raw = "buckets" |> QshellInvisible (('\n' |> raw.Trim().Split) |> List.ofArray).Tail let SelectBucket _ = "[-] Buckets" |> Console.WriteLine (GetBuckets() |>> List.iteri (fun i x -> ["[*]"; i.ToString(); "|"; x] |> String.concat " " |> Console.WriteLine)).[("bucket:" |> Input |> Convert.ToInt32) - 1] let Logic accessKey secretKey = ("account " + accessKey + " " + secretKey) |> Qshell |> ignore let CheckLogic _ = not <| (QshellInvisible "buckets").Contains "error" let FilePick _ = let dialog = new OpenFileDialog() match dialog.ShowDialog() with | DialogResult.OK -> dialog.FileName | _ -> failwith "Empty Path" let Rput bucket filename path = ["rput"; bucket; DoubleQuotes filename; DoubleQuotes path; "--overwrite"] |> String.concat " " |> Qshell |> ignore let QiniuFileUpload _ = match CheckLogic() with | true -> if Input "是否以上次登录的账号继续?(Y/n)" = "n" then Logic "0" "0" | _ -> while CheckLogic() do Console.WriteLine "[!] Logic Fail" Logic (Input "AccessKey:") (Input "SecretKey:") Console.WriteLine "[*] Logic Successed" let path = FilePick() let filename = Path.GetFileName path Rput (SelectBucket()) ( match ["filename(default="; DoubleQuotes filename; "):"] |> List.reduce (+) |> Input with | "" -> filename | fname -> fname) path [<STAThread>] [<EntryPoint>] let main _ = QiniuFileUpload() "Done." |> Input |> ignore 0