Silent killer
16-03-2012, 07:33
Ciao a tutti, mi sto cimentando da poco sul C# e volevo creare un programmino che individuasse files uguali all'interno di un percorso, analizzando anche le sottodir.
Inizialmente ho scritto il programma, e in un punto ho utilizzato questa:
foreach (string filePath in Directory.EnumerateFiles(Percorso, "*", SearchOption.AllDirectories)) { ListaFiles.Add(new FileInfo(filePath)); }
Per crearmi una lista di FileInfo, però l'opzione SearchOption.AllDirectories non funziona bene: in pratica quando trova una cartella con accesso negato, si blocca e termina, senza andare avanti nella ricerca di files.
Allora ho pensato di far da me un sistema per cercare i files e ho trovato un algoritmo su msdn che ho modificato in modo da ottenere alla fine una lista di FileInfo:
public class RecursiveFileSearch
{
static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();
static void Main()
{
System.IO.DirectoryInfo rootDir = new DirectoryInfo(@"F:\Disegni\");
System.IO.FileInfo[] ListaFiles = null;
ListaFiles= WalkDirectoryTree(rootDir, ListaFiles);
// Write out all the files that could not be processed.
Console.WriteLine("Files with restricted access:");
foreach (string s in log)
{
Console.WriteLine(s);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key");
Console.ReadKey();
}
static FileInfo[] WalkDirectoryTree(System.IO.DirectoryInfo root, FileInfo[] files)
{
System.IO.DirectoryInfo[] subDirs = null;
FileInfo[] AllResults = null;
// First, process all the files directly under this folder
try
{
FileInfo[] filesSottoDir = root.GetFiles("*.*");
AllResults = new FileInfo[files.Length + filesSottoDir.Length];
files.CopyTo(AllResults, 0);
filesSottoDir.CopyTo(AllResults, files.Length);
}
// This is thrown if even one of the files requires permissions greater
// than the application provides.
catch (UnauthorizedAccessException e)
{
// This code just writes out the message and continues to recurse.
// You may decide to do something different here. For example, you
// can try to elevate your privileges and access the file again.
log.Add(e.Message);
}
catch (System.IO.DirectoryNotFoundException e)
{
//Console.WriteLine(e.Message);
}
catch { }
// Now find all the subdirectories under this directory.
try
{
subDirs = root.GetDirectories();
}
catch { }
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
// Resursive call for each subdirectory.
AllResults = WalkDirectoryTree(dirInfo, AllResults);
}
return AllResults;
}
}
}
Il problema è che non funziona niente, qualcuno potrebbe aiutarmi? Non riesco a capire perchè non entra nel blocco di ricerca dei files.. grazie ;)
Inizialmente ho scritto il programma, e in un punto ho utilizzato questa:
foreach (string filePath in Directory.EnumerateFiles(Percorso, "*", SearchOption.AllDirectories)) { ListaFiles.Add(new FileInfo(filePath)); }
Per crearmi una lista di FileInfo, però l'opzione SearchOption.AllDirectories non funziona bene: in pratica quando trova una cartella con accesso negato, si blocca e termina, senza andare avanti nella ricerca di files.
Allora ho pensato di far da me un sistema per cercare i files e ho trovato un algoritmo su msdn che ho modificato in modo da ottenere alla fine una lista di FileInfo:
public class RecursiveFileSearch
{
static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();
static void Main()
{
System.IO.DirectoryInfo rootDir = new DirectoryInfo(@"F:\Disegni\");
System.IO.FileInfo[] ListaFiles = null;
ListaFiles= WalkDirectoryTree(rootDir, ListaFiles);
// Write out all the files that could not be processed.
Console.WriteLine("Files with restricted access:");
foreach (string s in log)
{
Console.WriteLine(s);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key");
Console.ReadKey();
}
static FileInfo[] WalkDirectoryTree(System.IO.DirectoryInfo root, FileInfo[] files)
{
System.IO.DirectoryInfo[] subDirs = null;
FileInfo[] AllResults = null;
// First, process all the files directly under this folder
try
{
FileInfo[] filesSottoDir = root.GetFiles("*.*");
AllResults = new FileInfo[files.Length + filesSottoDir.Length];
files.CopyTo(AllResults, 0);
filesSottoDir.CopyTo(AllResults, files.Length);
}
// This is thrown if even one of the files requires permissions greater
// than the application provides.
catch (UnauthorizedAccessException e)
{
// This code just writes out the message and continues to recurse.
// You may decide to do something different here. For example, you
// can try to elevate your privileges and access the file again.
log.Add(e.Message);
}
catch (System.IO.DirectoryNotFoundException e)
{
//Console.WriteLine(e.Message);
}
catch { }
// Now find all the subdirectories under this directory.
try
{
subDirs = root.GetDirectories();
}
catch { }
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
// Resursive call for each subdirectory.
AllResults = WalkDirectoryTree(dirInfo, AllResults);
}
return AllResults;
}
}
}
Il problema è che non funziona niente, qualcuno potrebbe aiutarmi? Non riesco a capire perchè non entra nel blocco di ricerca dei files.. grazie ;)