using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; namespace ImageCatalog { public class FileHelper { // Private dirSourceDest As Dictionary(Of FileInfo, DirectoryInfo) private int filesPerFolder; private string suffix; private int counterSize; private int numerationType; private string filter; private bool separateFiles; private string extensions = "*.jpg,*.png,*.gif"; public enum numerazione { Progressiva, Files } /// /// Preparazione per la separazione /// /// /// /// /// /// public FileHelper(int filesPerFolder, string suffix, int counterSize, int numerationType) { this.filesPerFolder = filesPerFolder; this.suffix = suffix; this.counterSize = counterSize; this.numerationType = numerationType; separateFiles = true; } /// /// nessuna separazione /// /// public FileHelper() { separateFiles = false; } public Dictionary GetFilesRecursive(DirectoryInfo root, DirectoryInfo destRoot, string filter) { var dirSourceDest = new Dictionary(); var result = new List(); // Dim stack As New Stack(Of DirectoryInfo) var stack = new Stack>(); this.filter = filter; var pair = new KeyValuePair(); // stack.Push(root) stack.Push(new KeyValuePair(root, destRoot)); while (stack.Count > 0) { var curDirKV = stack.Pop(); // curDirKP = stack.Pop() var dir = curDirKV.Key; var dDir = curDirKV.Value; try { // result.AddRange(dir.GetFiles(filter, SearchOption.TopDirectoryOnly)) // dividere file qui if (filesPerFolder > 0 & separateFiles) { appendDictionary(dirSourceDest, dividiFilesInDir(dir, dDir)); } else { appendDictionary(dirSourceDest, getAllFilesInDir(dir, dDir)); } foreach (DirectoryInfo subDirectory in dir.GetDirectories()) stack.Push(new KeyValuePair(subDirectory, new DirectoryInfo(Path.Combine(dDir.FullName, subDirectory.Name)))); } catch (Exception ex) { var e = ex.Demystify(); Console.WriteLine(e); Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } } return dirSourceDest; } // Public Class FileData // Public File As FileInfo // Public Directory As DirectoryInfo // Public Sub New(newFile As FileInfo, newDirectory As DirectoryInfo) // File = newFile // Directory = newDirectory // End Sub // End Class // Public Function GetFilesRecursiveParallel(ByVal root As DirectoryInfo, ByVal destRoot As DirectoryInfo, ByVal filter As String) As List(Of FileData) // Dim dirSourceDest As New ConcurrentDictionary(Of FileInfo, DirectoryInfo) // Dim result As New List(Of FileInfo) // 'Dim stack As New Stack(Of DirectoryInfo) // Dim stack As New Stack(Of KeyValuePair(Of DirectoryInfo, DirectoryInfo)) // Me.filter = filter // Dim pair As New KeyValuePair(Of DirectoryInfo, DirectoryInfo) // 'stack.Push(root) // stack.Push(New KeyValuePair(Of DirectoryInfo, DirectoryInfo)(root, destRoot)) // Do While (stack.Count > 0) // Dim curDirKV As KeyValuePair(Of DirectoryInfo, DirectoryInfo) = stack.Pop // 'curDirKP = stack.Pop() // Dim dir As DirectoryInfo = curDirKV.Key // Dim dDir As DirectoryInfo = curDirKV.Value // Try // 'result.AddRange(dir.GetFiles(filter, SearchOption.TopDirectoryOnly)) // ' dividere file qui // If filesPerFolder > 0 And separateFiles Then // AppendDictionaryConcurrent(dirSourceDest, DividiFilesInDirConcurrent(dir, dDir)) // Else // AppendDictionaryConcurrent(dirSourceDest, DividiFilesInDirConcurrent(dir, dDir)) // End If // For Each subDirectory As DirectoryInfo In dir.GetDirectories // stack.Push(New KeyValuePair(Of DirectoryInfo, DirectoryInfo)(subDirectory, New DirectoryInfo(Path.Combine(dDir.FullName, subDirectory.Name)))) // Next // Catch ex As Exception // ' TODO: FARE QUALCOSA // End Try // Loop // Dim resultData As New List(Of FileData) // resultData.AddRange(From p In dirSourceDest Select New FileData(p.Key, p.Value)) // Return resultData // 'Return dirSourceDest // End Function public Dictionary appendDictionary(Dictionary dictA, Dictionary dictB) { foreach (KeyValuePair pair in dictB) dictA.Add(pair.Key, pair.Value); return dictA; } // Public Function AppendDictionaryConcurrent(ByVal dictA As ConcurrentDictionary(Of FileInfo, DirectoryInfo), ByVal dictB As ConcurrentDictionary(Of FileInfo, DirectoryInfo)) As ConcurrentDictionary(Of FileInfo, DirectoryInfo) // For Each pair As KeyValuePair(Of FileInfo, DirectoryInfo) In dictB // dictA.TryAdd(pair.Key, pair.Value) // 'dictA.Add(pair.Key, pair.Value) // Next // Return dictA // End Function public Dictionary getAllFilesInDir(DirectoryInfo dir, DirectoryInfo dirDest) { var dict = new Dictionary(); foreach (FileInfo File in dir.GetFiles(filter)) dict.Add(File, new DirectoryInfo(Path.Combine(dirDest.FullName, File.Name))); return dict; } private Dictionary dividiFilesInDir(DirectoryInfo dir, DirectoryInfo dirDest) { int filesCount = dir.GetFiles(filter).Count(); int contaFilePerDir = 0; int contaDirPerDir = 0; string tempText = string.Empty; var foldersDict = new Dictionary(); DirectoryInfo destDir; destDir = new DirectoryInfo(Path.Combine(dirDest.FullName)); foreach (FileInfo file in dir.GetFiles(filter)) { contaFilePerDir += 1; if (contaFilePerDir == contaDirPerDir * filesPerFolder + 1) { contaDirPerDir += 1; if (numerationType == (int)numerazione.Progressiva) { tempText = contaDirPerDir.ToString(); } else { tempText = (contaDirPerDir * filesPerFolder).ToString(); } int i; var loopTo = counterSize - tempText.Length; for (i = 1; i <= loopTo; i++) tempText = "0" + tempText; destDir = new DirectoryInfo(Path.Combine(dirDest.FullName, suffix + tempText)); } if (!destDir.Exists) { destDir.Create(); } foldersDict.Add(file, destDir); } return foldersDict; } private ConcurrentDictionary DividiFilesInDirConcurrent(DirectoryInfo dir, DirectoryInfo dirDest) { int filesCount = dir.GetFiles(filter).Count(); int contaFilePerDir = 0; int contaDirPerDir = 0; string tempText = string.Empty; var foldersDict = new ConcurrentDictionary(); DirectoryInfo destDir; destDir = new DirectoryInfo(Path.Combine(dirDest.FullName)); foreach (FileInfo file in dir.GetFiles(filter)) { contaFilePerDir += 1; if (contaFilePerDir == contaDirPerDir * filesPerFolder + 1) { contaDirPerDir += 1; if (numerationType == (int)numerazione.Progressiva) { tempText = contaDirPerDir.ToString(); } else { tempText = (contaDirPerDir * filesPerFolder).ToString(); } int i; var loopTo = counterSize - tempText.Length; for (i = 1; i <= loopTo; i++) tempText = "0" + tempText; destDir = new DirectoryInfo(Path.Combine(dirDest.FullName, suffix + tempText)); } if (!destDir.Exists) { destDir.Create(); } foldersDict.TryAdd(file, destDir); } return foldersDict; } } }