public static void Main(string[] args) { if (args.Length < 3) { PrintHelp(); return; } var directoryToScan = args[0]; if (!Directory.Exists(directoryToScan)) { Console.WriteLine(string.Format("Directory {0} does not exist", directoryToScan)); PrintHelp(); return; } var fileAction = GetFileAction(args); if(fileAction == null) { PrintHelp(); return; } var allDrives = GetDrives(args); if (!allDrives.Any()) { PrintHelp(); return; } var manager = new FilingManager.FilingManager(); foreach (var d in allDrives) { manager.AddDriveHolding(d); } var allMediaFiles = Directory.EnumerateFiles(directoryToScan, "*.mp4") .Union(Directory.EnumerateFiles(directoryToScan, "*.mkv")) .Union(Directory.EnumerateFiles(directoryToScan, "*.avi")) .Union(Directory.EnumerateFiles(directoryToScan, "*.wmv")); InitializeProfilingEnvironment(); ProcessAllMediaFiles(allMediaFiles, manager, fileAction.Value); PrintStatistics(); }
private static void ProcessAllMediaFiles(IEnumerable<string> allMediaFiles, FilingManager.FilingManager manager, FileAction fileAction) { var resultDictionary = new ConcurrentDictionary<string, string>(); var failureBag = new ConcurrentBag<string>(); Parallel.ForEach(allMediaFiles, mediaFile => { Console.WriteLine(string.Format("[INFO]: Analyzing {0}", mediaFile)); ClockIn(mediaFile); var fileName = Path.GetFileName(mediaFile); var fansubFile = FansubFileParsers.ParseFansubFile(fileName); string folder; var findResult = manager.TrySubmitFansubFile(fansubFile, out folder); ClockOut(mediaFile); Console.WriteLine(string.Format("[INFO]: Finished analyzing {0}", mediaFile)); if (findResult) { resultDictionary.TryAdd(mediaFile, folder); } else { failureBag.Add(mediaFile); } }); foreach (var resultEntry in resultDictionary) { var originalFile = resultEntry.Key; var destFolder = resultEntry.Value; var justFileName = Path.GetFileName(originalFile); var finalDest = Path.Combine(destFolder, justFileName); Action actionOnFile = default(Action); Action<Exception> reactionOnFile = default(Action<Exception>); switch (fileAction) { case FileAction.MOVE: actionOnFile = () => MoveFile(originalFile, finalDest); reactionOnFile = e => MoveReaction(originalFile, finalDest, e); break; case FileAction.COPY: actionOnFile = () => CopyFile(originalFile, finalDest); reactionOnFile = e => CopyReaction(originalFile, finalDest, e); break; default: throw new InvalidOperationException("Unable to determine FileAction"); } SafeAction(actionOnFile, reactionOnFile); } var builder = new StringBuilder(); foreach (var failure in failureBag) { builder.AppendFormat("[Error]: Could not find folder for {0}.", failure).AppendLine(); } Console.Write(builder.ToString()); }