コード例 #1
0
        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();
        }
コード例 #2
0
        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());
        }