示例#1
0
文件: Common.cs 项目: F-D-R/FDR
        public static List <FileInfo> GetFiles(DirectoryInfo folder, ImportConfig config)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }
            config.Validate();

            return(GetFiles(folder, config.FileFilter));
        }
示例#2
0
文件: Import.cs 项目: F-D-R/FDR
        private static ImportConfig FindConfig(DirectoryInfo source, ImportConfig[] configs)
        {
            var matchingConfigs = new List <ImportConfig>();
            var options         = new EnumerationOptions();

            options.MatchCasing           = MatchCasing.CaseInsensitive;
            options.RecurseSubdirectories = true;

            foreach (var config in configs)
            {
                if (config.Rules != null && config.Rules.Length > 0)
                {
                    ImportConfig tmpconfig = null;
                    bool         ok        = true;

                    foreach (var rule in config.Rules)
                    {
                        switch (rule.Type)
                        {
                        case RuleType.volume_label:
                            if (string.Compare(GetVolumeLabel(source.FullName), rule.Param, true) == 0)
                            {
                                tmpconfig = config;
                            }
                            else
                            {
                                ok = false;
                            }
                            break;

                        case RuleType.contains_file:
                            if (Common.GetFiles(source, rule.Param).Any())
                            {
                                tmpconfig = config;
                            }
                            else
                            {
                                ok = false;
                            }
                            break;

                        case RuleType.contains_folder:
                            //TODO: Common.GetDirectories
                            if (Directory.GetDirectories(source.FullName, rule.Param, SearchOption.AllDirectories).Any())
                            {
                                tmpconfig = config;
                            }
                            else
                            {
                                ok = false;
                            }
                            break;

                        default:
                            throw new NotImplementedException($"Unknown rule type: {rule.Type}");
                        }
                    }

                    if (ok && tmpconfig != null && !matchingConfigs.Contains(tmpconfig))
                    {
                        matchingConfigs.Add(tmpconfig);
                    }
                }
            }

            if (matchingConfigs.Count == 1)
            {
                return(matchingConfigs[0]);
            }
            return(null);
        }
示例#3
0
文件: Import.cs 项目: F-D-R/FDR
        public static void ImportFiles(DirectoryInfo source, ImportConfig config)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }
            config.Validate();
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (!source.Exists)
            {
                throw new DirectoryNotFoundException($"Source folder doesn't exist! ({source.FullName})");
            }
            if (string.IsNullOrWhiteSpace(config.DestRoot))
            {
                throw new ArgumentNullException("DestRoot");
            }
            if (!Directory.Exists(config.DestRoot))
            {
                throw new DirectoryNotFoundException($"Destination root folder doesn't exist! ({config.DestRoot})");
            }

            var files     = Common.GetFiles(source, config.FileFilter);
            var fileCount = files.Count();

            var folderNames = new List <string>();
            //TODO: exif date...
            var dates = files.Select(f => f.CreationTime.Date).Distinct().OrderBy(d => d).ToList();

            foreach (var date in dates)
            {
                var count = files.Where(f => f.CreationTime.Date == date).Count();

                var destFolder = GetAbsoluteDestFolder(config.DestRoot, config.DestStructure, date, config.DateFormat);
                var rootFolder = Path.GetDirectoryName(destFolder);
                var folderName = Path.GetFileName(destFolder);

                if (Directory.Exists(rootFolder))
                {
                    var childFolders = Directory.GetDirectories(rootFolder, folderName + "*");
                    if (childFolders.Length > 0)
                    {
                        var destFiles = Directory.GetFiles(childFolders[0], "*");
                        Common.Msg($"{date:yyyy-MM-dd}: Destination exists ({destFiles.Length} files in {childFolders[0]}), ignoring {count} files", ConsoleColor.Yellow);
                        files = files.Where(f => f.CreationTime.Date != date).OrderBy(f => f.CreationTimeUtc).ToList();
                        continue;
                    }
                }

                Common.Msg($"{date:yyyy-MM-dd}: Importing {count} files to {destFolder}");
                folderNames.Add(destFolder);
            }
            Common.Msg("");

            // Copy
            dates = files.Select(f => f.CreationTime.Date).Distinct().OrderBy(d => d).ToList();
            var i = 0;

            Common.Progress(0);
            foreach (var date in dates)
            {
                var count  = files.Where(f => f.CreationTime.Date == date).Count();
                var folder = GetAbsoluteDestFolder(config.DestRoot, config.DestStructure, date, config.DateFormat);

                Common.Msg($"Copying {count} files to {folder}");
                Trace.Indent();
                foreach (var file in files.Where(file => file.CreationTime.Date == date).OrderBy(file => file.CreationTime))
                {
                    CopyFile(config.DestRoot, file, config.DestStructure, config.DateFormat, 100 * i / fileCount);
                    i++;
                }
                Trace.Unindent();
            }

            // Rename
            if (config.RenameConfigs != null)
            {
                foreach (var fn in folderNames)
                {
                    foreach (var rc in config.RenameConfigs)
                    {
                        Rename.RenameFilesInFolder(new DirectoryInfo(fn), rc);
                    }
                }
            }

            // Move
            if (config.MoveConfigs != null)
            {
                foreach (var fn in folderNames)
                {
                    foreach (var mc in config.MoveConfigs)
                    {
                        MoveFilesInFolder(new DirectoryInfo(fn), mc);
                    }
                }
            }
        }