Exemple #1
0
 public SaveFileClusterProxy(FileCluster data, string configurationName)
 {
     Data = data;
     ConfigurationName = configurationName;
 }
Exemple #2
0
 public FileClusterProxy(FileCluster data)
 {
     Data = data;
     OnPropertyChanged();
 }
Exemple #3
0
        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 ################");
        }