o hágalo usted mismo,
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern IntPtr FindFirstFile(string lpFileName, out
WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern bool FindNextFile(IntPtr hFindFile, out
WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool FindClose(IntPtr hFindFile);
// Assume dirName passed in is already prefixed with \\?\
public static IEnumerable<string> EnumerateEntries(string directory)
{
WIN32_FIND_DATA findData;
IntPtr findHandle = FindFirstFile(dirName + @"\*", out findData);
try
{
if (findHandle != INVALID_HANDLE_VALUE)
{
bool found;
do
{
string currentFileName = findData.cFileName;
// if this is a directory, find its contents
if (((int)findData.dwFileAttributes &
FILE_ATTRIBUTE_DIRECTORY) != 0)
{
if (currentFileName != "." && currentFileName != "..")
{
foreach(var child in FindFilesAndDirs(
Path.Combine(dirName, currentFileName))
{
yield return child;
}
}
}
yield return Path.Combine(dirName, currentFileName);
// find next
found = FindNextFile(findHandle, out findData);
}
while (found);
}
}
finally
{
// close the find handle
FindClose(findHandle);
}
}
no he verificado el código y, obviamente, no están definidos todos los tipos pero nos debería apuntar en la dirección correcta.
cuidado Downvoter comentar? – soandos
Las mejores prácticas para la digitalización de los sistemas de ficheros enteros parece ser interruptores contexto individual - en .NET, que probablemente va a parecer un nuevo hilo - por lo menos el primer nivel si no es segunda o incluso tercera. Es decir, gire un hilo por cada carpeta raíz, cambie el directorio una vez en ese hilo, luego continúe. Si eres inteligente, puede girar de forma adaptativa un hilo sólo cuando la longitud del trayecto cruza un umbral, a continuación, cambiar el directorio allí y efectivamente restablecer su tolerancia a la longitud del trayecto. – ssamuel
Cómo iterar a través de un árbol de directorios (Guía de programación de C#) http://msdn.microsoft.com/en-us/library/bb513869.aspx – JamieSee