public SaveFileClusterProxy(FileCluster data, string configurationName) { Data = data; ConfigurationName = configurationName; }
public FileClusterProxy(FileCluster data) { Data = data; OnPropertyChanged(); }
private void Process(bool doMove) { string path = txtPath.Text; if (!Directory.Exists(path)) { MessageBox.Show("El directorio no existe"); return; } ctrOutput.Clean(); lastMessage = DateTime.UtcNow; List <FileDesc> files = new List <FileDesc>(); ScanDirectory(path, files); if (_running == false) { return; } ctrOutput.AddLine(string.Format("Detected total {0} files", files.Count)); // Duplicated files List <List <FileDesc> > duplicated = new List <List <FileDesc> >(); for (int i = 0; i < (files.Count - 1); i++) { List <FileDesc> currentDups = null; for (int j = (i + 1); j < files.Count; j++) { if (files[i].FileNameLower == files[j].FileNameLower) { if (currentDups == null) { currentDups = new List <FileDesc>(); currentDups.Add(files[i]); } currentDups.Add(files[j]); } } if (currentDups != null) { duplicated.Add(currentDups); } } if (duplicated.Count > 0) { foreach (List <FileDesc> dups in duplicated) { ctrOutput.AddLine(string.Format("Duplicated file: {0}", dups[0].FileName)); foreach (FileDesc file in dups) { ctrOutput.AddLine(string.Format(" Path: {0}", file.Path), file.Path); } } } else { ctrOutput.AddLine("No duplicates found"); } List <string> imageExtensions = new List <string> { ".jpg", ".jpeg", ".png", ".bpm", ".gif", ".tga", ".webp", }; List <string> movieExtensions = new List <string> { ".avi", ".mkv", ".mp4", ".mov", ".webm", ".flv", }; List <FileDesc> mediaFiles = files .Where(fd => imageExtensions.Contains(fd.Extension) || movieExtensions.Contains(fd.Extension)) .OrderBy(fd => fd.Date) .ToList(); ctrOutput.AddLine(string.Format("Detected {0} media", mediaFiles.Count)); List <FileDesc> noMediaFiles = files .Where(fd => imageExtensions.Contains(fd.Extension) == false && movieExtensions.Contains(fd.Extension) == false) .OrderBy(fd => fd.Date) .ToList(); ctrOutput.AddLine(string.Format("Detected {0} no media", noMediaFiles.Count)); // Find clusters int maxHoursDiff = 15; List <FileCluster> clusters = new List <FileCluster>(); FileCluster currentCluster = new FileCluster(); clusters.Add(currentCluster); FileDesc previousFile = null; foreach (FileDesc currentFile in mediaFiles) { if (previousFile == null) { currentCluster.Files.Add(currentFile); previousFile = currentFile; continue; } TimeSpan tsDiff = currentFile.Date - previousFile.Date; if (tsDiff.TotalHours > maxHoursDiff) { // New cluster currentCluster = new FileCluster(); clusters.Add(currentCluster); currentCluster.Files.Add(currentFile); previousFile = currentFile; continue; } // Add to current cluster currentCluster.Files.Add(currentFile); previousFile = currentFile; } foreach (FileCluster cluster in clusters) { if (cluster.Files.Count == 0) { continue; } cluster.DateStart = cluster.Files.Min(fd => fd.Date); cluster.DateEnd = cluster.Files.Max(fd => fd.Date); TimeSpan tsCluster = cluster.DateEnd - cluster.DateStart; if (tsCluster.TotalDays > 1) { cluster.DirName = cluster.DateStart.ToString("yyyy-MM"); } else { cluster.DirName = cluster.DateStart.ToString("yyyy-MM-dd"); } } foreach (FileCluster cluster in clusters) { if (cluster.Files.Count == 0) { continue; } string clusterPath = Path.Combine(path, cluster.DirName); ctrOutput.AddLine(string.Format("Cluster: {0}", clusterPath)); if (doMove) { BuildPath(clusterPath); } foreach (FileDesc file in cluster.Files) { ctrOutput.AddLine(string.Format(" Path: {0} ", file.Path), file.Path); if (doMove) { string newFilePath = Path.Combine(clusterPath, file.FileName); File.Move(file.Path, newFilePath); } } } ctrOutput.AddLine("################ Finish ################"); }