Nell'esempio seguente, il più veloce (non in parallelo) elenca file e sottocartelle in una struttura di directory che gestisce le eccezioni. Sarebbe più rapido utilizzare Directory.EnumerateDirectories utilizzando SearchOption.AllDirectories per enumerare tutte le directory, ma questo metodo non riuscirà se viene rilevato un oggetto UnauthorizedAccessException o PathTooLongException.
Utilizza il tipo di raccolta Stack generica, che è uno stack Last in First Out (LIFO) e non utilizza la ricorsione. Da https://msdn.microsoft.com/en-us/library/bb513869.aspx, consente di enumerare tutte le sottodirectory e i file e gestire efficacemente tali eccezioni.
public class StackBasedIteration
{
static void Main(string[] args)
{
// Specify the starting folder on the command line, or in
// Visual Studio in the Project > Properties > Debug pane.
TraverseTree(args[0]);
Console.WriteLine("Press any key");
Console.ReadKey();
}
public static void TraverseTree(string root)
{
// Data structure to hold names of subfolders to be
// examined for files.
Stack<string> dirs = new Stack<string>(20);
if (!System.IO.Directory.Exists(root))
{
throw new ArgumentException();
}
dirs.Push(root);
while (dirs.Count > 0)
{
string currentDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.EnumerateDirectories(currentDir); //TopDirectoryOnly
}
// An UnauthorizedAccessException exception will be thrown if we do not have
// discovery permission on a folder or file. It may or may not be acceptable
// to ignore the exception and continue enumerating the remaining files and
// folders. It is also possible (but unlikely) that a DirectoryNotFound exception
// will be raised. This will happen if currentDir has been deleted by
// another application or thread after our call to Directory.Exists. The
// choice of which exceptions to catch depends entirely on the specific task
// you are intending to perform and also on how much you know with certainty
// about the systems on which this code will run.
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
string[] files = null;
try
{
files = System.IO.Directory.EnumerateFiles(currentDir);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
continue;
}
// Perform the required action on each file here.
// Modify this block to perform your required task.
foreach (string file in files)
{
try
{
// Perform whatever action is required in your scenario.
System.IO.FileInfo fi = new System.IO.FileInfo(file);
Console.WriteLine("{0}: {1}, {2}", fi.Name, fi.Length, fi.CreationTime);
}
catch (System.IO.FileNotFoundException e)
{
// If file was deleted by a separate application
// or thread since the call to TraverseTree()
// then just continue.
Console.WriteLine(e.Message);
continue;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine(e.Message);
continue;
}
}
// Push the subdirectories onto the stack for traversal.
// This could also be done before handing the files.
foreach (string str in subDirs)
dirs.Push(str);
}
}
}
sfogliare lo spazio dei nomi System.IO per [classi] (http://msdn.microsoft.com/en-us/library/wa70yfe2 (v = vs.100)) e [metodi] (http://msdn.microsoft.com/en-us/library/dd383459 (v = vs.100)) che potrebbero aiutarti. – Lucero
Dai un'occhiata a [questa domanda] (http://stackoverflow.com/q/1651869/335858) e rilascia la parte in cui corrisponde a un modello. – dasblinkenlight
possibile duplicato di [Come elencare in modo ricorsivo tutti i file in una directory in C#?] (Http://stackoverflow.com/questions/929276/how-to-recursively-list-all-the-files-in-a- directory-in-c) – JoshRivers