private void InitialiseWork(string srcDir, string dstDir) { DictTargetFolderToSrcFiles.Clear(); FilesProcessed.Clear(); FoldersCreated.Clear(); DirectoryInfo info = new DirectoryInfo(srcDir); foreach (var file in info.GetFiles("*.*", SearchOption.AllDirectories)) { string targetDir = FileOrganizerUtility.PrepareTargetDirFromFile(dstDir, file); if (!DictTargetFolderToSrcFiles.ContainsKey(targetDir)) { DictTargetFolderToSrcFiles.Add(targetDir, new List <FileInfo>() { file }); } else { DictTargetFolderToSrcFiles[targetDir].Add(file); } } }
private void Work( CancellationTokenSource tokenSrc, Action <string> UpdateStatus) { while (!tokenSrc.IsCancellationRequested) { PauseEvent.WaitOne(); KeyValuePair <string, List <FileInfo> >?work = GetWork(); if (work == null) { //// task exiting. No more files to process. return; } string targetFolder = work.Value.Key; List <FileInfo> srcFiles = work.Value.Value; if (!Directory.Exists(targetFolder)) { DirectoryInfo inf = new DirectoryInfo(targetFolder); while (!inf.Parent.Exists) { inf = inf.Parent; } UpdateStatus?.Invoke($"Creating directory: {targetFolder}"); Directory.CreateDirectory(targetFolder); if (!FoldersCreated.Contains(inf.FullName)) { lock (_sync) { if (!FoldersCreated.Any(x => inf.FullName.Contains(x))) { FoldersCreated.Add(inf.FullName); } } } } foreach (FileInfo srcFile in srcFiles) { PauseEvent.WaitOne(); if (tokenSrc.IsCancellationRequested) { break; } UpdateStatus?.Invoke($"Processing: {srcFile.FullName}"); string dstFile = FileOrganizerUtility.GetTargetFileName( srcFile.FullName, targetFolder); if (File.Exists(dstFile)) { dstFile = FileOrganizerUtility.AddGuidToFileNameConflict(dstFile); } if (srcFile.CopyTo(dstFile).Exists != true) { throw new IOException( $"Failed to copy file from '{srcFile.FullName}' to '{dstFile}'"); } FilesProcessed.Add(dstFile); UpdateStatus?.Invoke($"Copied source: {srcFile.FullName} to destination: {dstFile}"); } } }