public static List <FileInfo> GetFiles(DirectoryInfo folder, ImportConfig config) { if (config == null) { throw new ArgumentNullException("config"); } config.Validate(); return(GetFiles(folder, config.FileFilter)); }
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); }
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); } } } }