From e36b2d9c839111ca04c390a9b3229207536c3a7c Mon Sep 17 00:00:00 2001 From: Ilya Finkelshteyn Date: Fri, 11 Jan 2019 17:11:00 -0800 Subject: [PATCH] Copy folder to multiple folders (initial checkin) + build config --- UBCopy/AsyncUnbuffCopyStatic.cs | 2 +- UBCopy/UBCopy.csproj.user | 2 +- UBCopy/UBCopyHandler.cs | 14 +++++++++----- UBCopy/UBCopyMain.cs | 6 +++--- UBCopy/UBCopyProcessor.cs | 22 +++++++++++++--------- UBCopy/UBCopySetup.cs | 23 +++++++++++++++++++++++ appveyor.yml | 14 ++++++++++++++ 7 files changed, 64 insertions(+), 19 deletions(-) create mode 100644 appveyor.yml diff --git a/UBCopy/AsyncUnbuffCopyStatic.cs b/UBCopy/AsyncUnbuffCopyStatic.cs index 6a5b0ea..741ecee 100644 --- a/UBCopy/AsyncUnbuffCopyStatic.cs +++ b/UBCopy/AsyncUnbuffCopyStatic.cs @@ -221,7 +221,7 @@ private static void AsyncWriteFile() if ((percent - currentPercent) >= 1) { currentPercent = percent; - Console.Write("\r{0}%", currentPercent); + Console.Write("\r{0}% ({1})", currentPercent, _outputfile); } } } diff --git a/UBCopy/UBCopy.csproj.user b/UBCopy/UBCopy.csproj.user index 5422f2a..5868ccc 100644 --- a/UBCopy/UBCopy.csproj.user +++ b/UBCopy/UBCopy.csproj.user @@ -1,7 +1,7 @@  - -s="C:\Users\Public\Documents\Hyper-V\Virtual hard disks\Windows81.vhdx" -d="C:\Users\Public\Documents\Hyper-V\Virtual hard disks\Windows81---copy.vhdx" -o=true -b=8 -c=false -m=false -t=8 -z=32 -l=31457280 -r=true + -s="C:\Temp\Deleteme\UBCopyTest" -d="C:\Temp\Deleteme\UBCopyTest2%3bC:\Temp\Deleteme\UBCopyTest3%3bC:\Temp\Deleteme\UBCopyTest4" -o=false -b=8 -c=false -m=false -t=8 -z=32 -l=31457280 -r=true -s=k:\downloads\SQL2000-KB884525-SP4-x86-ENU.EXE -d=c:\delme.zip -o=true -c=false -r=true -b=1 diff --git a/UBCopy/UBCopyHandler.cs b/UBCopy/UBCopyHandler.cs index 8cf5624..5559af5 100644 --- a/UBCopy/UBCopyHandler.cs +++ b/UBCopy/UBCopyHandler.cs @@ -44,6 +44,7 @@ public static int ProcessFiles(string inputfile, string outputfile, bool overwri throw new Exception("Target cannot be empty"); var inputIsFile = false; + UBCopySetup.Overwritedestination = overwrite; UBCopySetup.Buffersize = buffersize; UBCopySetup.Checksumfiles = checksum; UBCopySetup.Destinationfile = outputfile; @@ -116,16 +117,16 @@ public static int ProcessFiles(string inputfile, string outputfile, bool overwri if (UBCopySetup.FileList.Count < numberthreads) { - numberthreads = UBCopySetup.FileList.Count; + numberthreads = UBCopySetup.FileToFolderList.Count; } if (inputIsFile) numberthreads = 1; - Log.InfoFormat("Number of Files To Process: {0}", UBCopySetup.FileList.Count); + Console.WriteLine("Number of file to folder combinatins: {0}", UBCopySetup.FileToFolderList.Count); var sw = new Stopwatch(); sw.Start(); - var ftph = UBCopySetup.FileList.Count; + var ftph = UBCopySetup.FileToFolderList.Count; if (numberthreads == 1) { @@ -153,7 +154,7 @@ public static int ProcessFiles(string inputfile, string outputfile, bool overwri { var doneEvents = new ManualResetEvent[numberthreads]; var hashFilesArray = new UBCopyProcessor[numberthreads]; - var ftp = UBCopySetup.FileList.Count; + var ftp = UBCopySetup.FileToFolderList.Count; while (ftp > 0) @@ -161,6 +162,9 @@ public static int ProcessFiles(string inputfile, string outputfile, bool overwri // Configure and launch threads using ThreadPool: if (ftp < numberthreads) numberthreads = ftp; + + Console.WriteLine("Number of threads: " + numberthreads); + for (var i = 0; i < numberthreads; i++) { doneEvents[i] = new ManualResetEvent(false); @@ -171,7 +175,7 @@ public static int ProcessFiles(string inputfile, string outputfile, bool overwri // Wait for all threads in pool to finished processing WaitHandle.WaitAll(doneEvents); - ftp = UBCopySetup.FileList.Count; + ftp = UBCopySetup.FileToFolderList.Count; } } sw.Stop(); diff --git a/UBCopy/UBCopyMain.cs b/UBCopy/UBCopyMain.cs index 521b60d..7b55a6d 100644 --- a/UBCopy/UBCopyMain.cs +++ b/UBCopy/UBCopyMain.cs @@ -103,9 +103,9 @@ private static int Main(string[] args) } sw.Stop(); - Log.InfoFormat("Number of Byes Copied : {0}", UBCopySetup.BytesCopied); - Log.InfoFormat("Elapsed Seconds : {0}", sw.ElapsedMilliseconds / 1000.00); - Log.Info("Done."); + Console.WriteLine ("Number of Bytes Copied : {0}", UBCopySetup.BytesCopied); + Console.WriteLine("Elapsed Seconds : {0}", sw.ElapsedMilliseconds / 1000.00); + Console.WriteLine("Done."); #if DEBUG { Console.ReadKey(); diff --git a/UBCopy/UBCopyProcessor.cs b/UBCopy/UBCopyProcessor.cs index 759f6cf..0bb3048 100644 --- a/UBCopy/UBCopyProcessor.cs +++ b/UBCopy/UBCopyProcessor.cs @@ -36,18 +36,22 @@ public void UBCopyThreadPoolCallback(Object threadContext) /// private static void UBCopyFile() { - string file; + + FileToFolder fileToFolder; + lock (UBCopySetup.DictonaryLocker) { - file = UBCopySetup.FileList.Pop(); - Log.DebugFormat("POP FILE: {0}", file); + + fileToFolder = UBCopySetup.FileToFolderList.Pop(); + Log.DebugFormat("POP FILE: {0} TO FOLDER {1}", fileToFolder.SourceFile, fileToFolder.DestinationFolder); } - if (String.IsNullOrEmpty(file)) + if (fileToFolder == null) { throw new Exception("File Name Cannot Be Null"); } - var destinationfile = Path.Combine(UBCopySetup.Destinationfile, file.Replace(Path.GetPathRoot(file), "")); - var fileSize = new FileInfo(file); + //var destinationfile = Path.Combine(UBCopySetup.Destinationfile, file.Replace(Path.GetPathRoot(file), "")); + var destinationfile = Path.Combine(fileToFolder.DestinationFolder, Path.GetFileName(fileToFolder.SourceFile)); + var fileSize = new FileInfo(fileToFolder.SourceFile); Log.DebugFormat("File Size: {0}", fileSize.Length); lock (Locker) @@ -57,18 +61,18 @@ private static void UBCopyFile() if (fileSize.Length < UBCopySetup.SynchronousFileCopySize) { var asyncUnbufferedCopy = new AsyncUnbuffCopy(); - asyncUnbufferedCopy.AsyncCopyFileUnbuffered(file, destinationfile, UBCopySetup.Overwritedestination, + asyncUnbufferedCopy.AsyncCopyFileUnbuffered(fileToFolder.SourceFile, destinationfile, UBCopySetup.Overwritedestination, UBCopySetup.Movefile, UBCopySetup.Checksumfiles, UBCopySetup.Buffersize, UBCopySetup.Reportprogres,UBCopySetup.BytesSecond); } else { - AsyncUnbuffCopyStatic.AsyncCopyFileUnbuffered(file, destinationfile, UBCopySetup.Overwritedestination, + AsyncUnbuffCopyStatic.AsyncCopyFileUnbuffered(fileToFolder.SourceFile, destinationfile, UBCopySetup.Overwritedestination, UBCopySetup.Movefile, UBCopySetup.Checksumfiles, UBCopySetup.Buffersize, UBCopySetup.Reportprogres, UBCopySetup.BytesSecond); } } } -} \ No newline at end of file +} diff --git a/UBCopy/UBCopySetup.cs b/UBCopy/UBCopySetup.cs index 38cd562..bb3d9c9 100644 --- a/UBCopy/UBCopySetup.cs +++ b/UBCopy/UBCopySetup.cs @@ -38,6 +38,8 @@ public static class UBCopySetup public static Stack FileList = new Stack(50000); + public static Stack FileToFolderList = new Stack(50000); + //hold command line options //public static string Sourcefile; public static string Destinationfile; @@ -62,6 +64,9 @@ public static class UBCopySetup /// public static void TraverseTree(string root) { + string[] destinationFolderList = Destinationfile.Contains(",") || Destinationfile.Contains(";") ? Destinationfile.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) + : new string[] { Destinationfile }; + var dirs = new Stack(20); if (!Directory.Exists(root)) @@ -116,6 +121,12 @@ public static void TraverseTree(string root) try { FileList.Push(file); + + foreach (var folder in destinationFolderList) + { + FileToFolderList.Push(new FileToFolder(file, folder)); + } + } catch (FileNotFoundException) { @@ -131,4 +142,16 @@ public static void TraverseTree(string root) } } } + + public class FileToFolder + { + public string SourceFile { get; set; } + public string DestinationFolder { get; set; } + + public FileToFolder(string sourceFile, string destinationFolder) + { + SourceFile = sourceFile; + DestinationFolder = destinationFolder; + } + } } \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..adf4ffa --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,14 @@ +version: 1.0.{build} +skip_tags: true +configuration: Release +build: + verbosity: minimal +artifacts: +- path: UBCopy\bin\$(configuration) + name: UBCopy +deploy: +- provider: GitHub + auth_token: + secure: KmYWY9jz5FpXpKkxpQvthnDkZiMCi0tmh5PCs/83mu4vm0QsEThuEqhEgMViCbCJ + on: + branch: internal-usage \ No newline at end of file