private static CCRecord ReadRecord(CCArguments args) { string ddCmdStr = args.Compile(); ddCmdStr = String.Format("\"{0}\"", ddCmdStr); var ddCmd = CliCommand.Create(CliScope.AdbExecOut, ddCmdStr); var ddRes = CliResult.Run(ddCmd, CliDataType.ByteArray); var ccRec = new CCRecord(); lock (ccRec) { ccRec.BinaryRaw = ddRes.ByteArray; //ccRec.StatsRaw = Android.Value.ReadFile(args.StatsRedirect); } //ddRes.CommandProcess.Close(); //ddRes.CommandProcess.WaitForExit(); //ddRes.CommandProcess.Kill(); return(ccRec); }
public static void Repull(string remote, string?dest = null) { if (dest == null) { string?fn = Path.GetFileNameWithoutExtension(remote); string?ext = Path.GetExtension(remote); string nn = fn + "_out" + ext; dest = Path.Combine(DefaultOutput, nn); } if (BlockSize >= BlockSizeMaxBytes) { Console.WriteLine("Warning: Using a block size larger than the recommended maximum"); } if (File.Exists(dest)) { File.Delete(dest); } long remSize = Android.GetFileSize(remote); long nBlocks = SizeToBlocks(remSize, BlockSize); if (BlockSize >= remSize) { nBlocks = 1; } Console.WriteLine("\nRemote file: {0}", remote); Console.WriteLine("Remote size: {0} bytes", remSize); Console.WriteLine("\nBlock size: {0} bytes ({1} bv, {2} bu)", BlockSize, BlockValue, BlockUnit); Console.WriteLine("\nDestination file: {0}", dest); double rateSum = 0; const int RND = 2; int nbytes = 0; var outStream = new FileStream(dest, FileMode.Append); var sw = Stopwatch.StartNew(); for (int i = 0; i <= nBlocks; i++) { var start = DateTimeOffset.Now; var ccArg = new CCArguments { Count = 1, InputBlockSize = BlockSize, InputFile = remote, Skip = i, }; var res = ReadRecord(ccArg); byte[] resBin = res.BinaryRaw; lock (resBin) { // ~123ms outStream.Write(resBin, 0, resBin.Length); outStream.Flush(); nbytes += resBin.Length; } var end = DateTime.Now; var duration = end - start; double bytesPerSec = resBin.Length / duration.TotalSeconds; double megabytesPerSec = Math.Round(ToMegabytes(bytesPerSec), RND); rateSum += megabytesPerSec; double avgMegabytesPerSec = Math.Round(rateSum / i, RND); double percent = (double)nbytes / remSize; Console.Write("\r{0}/{1} ({2} MB/sec) ({3} MB/sec avg) ({4:P})", i, nBlocks, megabytesPerSec, avgMegabytesPerSec, percent); //Console.Clear(); } outStream.Flush(); outStream.Close(); sw.Stop(); Console.WriteLine("Completed in {0:F} sec", sw.Elapsed.TotalSeconds); Console.WriteLine("\n\nWrote data to {0}!\n\n", dest); if (RunChecks) { Console.WriteLine("Verifying files"); var destSize = new FileInfo(dest).Length; var destSha1 = Sha1_Hash.GetFileHashString(dest); var remSha1 = Android.GetFileSha1Hash(remote); Console.WriteLine("Size equal: {0} | Sha1 equal: {1}", CliUtilities.GetSuccessChar(destSize, remSize), CliUtilities.GetSuccessChar(destSha1, remSha1)); } }