Recuento de archivos de una carpeta

80

¿Cómo obtengo la cantidad de archivos de una carpeta usando ASP.NET con C #?

Sreejesh Kumar
fuente

Respuestas:

58
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;
X4lldux
fuente
3
¿Cuál es el comportamiento si el directorio contiene más de archivos int.MaxValue?
Mel Gerats
2
Para una solución más actualizada que sea más liviana en recursos, reemplace GetFiles () por EnumerateFiles () y Length por Count ()
relativamente_
128

Puede utilizar el método Directory.GetFiles

Consulte también el método Directory.GetFiles (String, String, SearchOption)

Puede especificar la opción de búsqueda en esta sobrecarga.

TopDirectoryOnly : incluye solo el directorio actual en una búsqueda.

AllDirectories : incluye el directorio actual y todos los subdirectorios en una operación de búsqueda. Esta opción incluye puntos de análisis como unidades montadas y enlaces simbólicos en la búsqueda.

// searches the current directory and sub directory
int fCount = Directory.GetFiles(path, "*", SearchOption.AllDirectories).Length;
// searches the current directory
int fCount = Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly).Length;
rahul
fuente
Puedo sugerir el uso de "*" para hacer coincidir los archivos, de lo contrario, los archivos sin extensiones no se incluirán en el recuento.
Nick Bull
Esto parece incluir el recuento de subcarpetas. Es decir, tengo una subcarpeta y en un directorio que de otro modo estaría vacío y esto devuelve 1.
Sea amable con los nuevos usuarios
@MichaelPotter ¿es posible que estuviera contando desktop.ini?
Heriberto Lugo
Para una solución más actualizada que sea más liviana en recursos, reemplace GetFiles () por EnumerateFiles () y Length por Count ()
relativamente_
22

El método más hábil sería utilizar LINQ :

var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
                        select file).Count();
Decano
fuente
5
Simplemente puede escribir: var fileCount = Directory.EnumerateFiles (@ "H: \ iPod_Control \ Music", "* .mp3", SearchOption.AllDirectories) .Count ();
AndrewS
1
Recomendé este método en caso de grandes colecciones de archivos. Este enfoque ahorra memoria. El método GetFilecrea la cadena [] que requiere espacio de memoria plana. Tenga cuidado :)
hsd
15
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath");
int count = dir.GetFiles().Length;

Puedes usar esto.

Krishna Thota
fuente
8

Leer archivos PDF de un directorio:

var list = Directory.GetFiles(@"C:\ScanPDF", "*.pdf");
if (list.Length > 0)
{

}
Nalan Madheswaran
fuente
Definición innecesaria de una lista. Esto debería hacer el trabajo: si Directory.Getfiles (@ "C: \ ScanPDF", "* .pdf"). Count> 0
Stefan Meyer
@StefanMeyer No, si vas a usar esa lista más tarde ...
Guille Bauza
@GuilleBauza La pregunta era contar los archivos PDF, no usarlos;)
Stefan Meyer
Sí, pero cuál es el punto de contar si no lo usas ...
Guille Bauza
3

Los métodos .NET Directory.GetFiles (dir) o DirectoryInfo.GetFiles () no son muy rápidos solo para obtener un recuento total de archivos. Si usa mucho este método de conteo de archivos, considere usar WinAPI directamente , lo que ahorra aproximadamente el 50% del tiempo.

Aquí está el enfoque de WinAPI donde encapsulo las llamadas de WinAPI a un método de C #:

int GetFileCount(string dir, bool includeSubdirectories = false)

Código completo:

[Serializable, StructLayout(LayoutKind.Sequential)]
private struct WIN32_FIND_DATA
{
    public int dwFileAttributes;
    public int ftCreationTime_dwLowDateTime;
    public int ftCreationTime_dwHighDateTime;
    public int ftLastAccessTime_dwLowDateTime;
    public int ftLastAccessTime_dwHighDateTime;
    public int ftLastWriteTime_dwLowDateTime;
    public int ftLastWriteTime_dwHighDateTime;
    public int nFileSizeHigh;
    public int nFileSizeLow;
    public int dwReserved0;
    public int dwReserved1;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string cFileName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
    public string cAlternateFileName;
}

[DllImport("kernel32.dll")]
private static extern IntPtr FindFirstFile(string pFileName, ref WIN32_FIND_DATA pFindFileData);
[DllImport("kernel32.dll")]
private static extern bool FindNextFile(IntPtr hFindFile, ref WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32.dll")]
private static extern bool FindClose(IntPtr hFindFile);

private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
private const int FILE_ATTRIBUTE_DIRECTORY = 16;

private int GetFileCount(string dir, bool includeSubdirectories = false)
{
    string searchPattern = Path.Combine(dir, "*");

    var findFileData = new WIN32_FIND_DATA();
    IntPtr hFindFile = FindFirstFile(searchPattern, ref findFileData);
    if (hFindFile == INVALID_HANDLE_VALUE)
        throw new Exception("Directory not found: " + dir);

    int fileCount = 0;
    do
    {
        if (findFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
        {
            fileCount++;
            continue;
        }

        if (includeSubdirectories && findFileData.cFileName != "." && findFileData.cFileName != "..")
        {
            string subDir = Path.Combine(dir, findFileData.cFileName);
            fileCount += GetFileCount(subDir, true);
        }
    }
    while (FindNextFile(hFindFile, ref findFileData));

    FindClose(hFindFile);

    return fileCount;
}

Cuando busco en una carpeta con 13000 archivos en mi computadora - Promedio: 110 ms

int fileCount = GetFileCount(searchDir, true); // using WinAPI

Método integrado de .NET: Directory.GetFiles (dir) - Promedio: 230 ms

int fileCount = Directory.GetFiles(searchDir, "*", SearchOption.AllDirectories).Length;

Nota: la primera ejecución de cualquiera de los métodos será entre un 60% y un 100% más lenta, respectivamente, porque el disco duro tarda un poco más en localizar los sectores. Las llamadas posteriores serán semi-almacenadas en caché por Windows, supongo.

detalle
fuente
Excelente solución, pero para que funcione, recomiendo la siguiente edición: |||||||||||| agregar public static long fileCount = 0; |||||||||||| // int fileCount = 0; // comentar
Markus
3
int fileCount = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Length; // Will Retrieve count of all files in directry and sub directries

int fileCount = Directory.GetFiles(path, "*.*", SearchOption.TopDirectory).Length; // Will Retrieve count of all files in directry but not sub directries

int fileCount = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories).Length; // Will Retrieve count of files XML extension in directry and sub directries
Varun
fuente
2

Intente seguir el código para obtener el recuento de archivos en la carpeta

string strDocPath = Server.MapPath('Enter your path here'); 
int docCount = Directory.GetFiles(strDocPath, "*", 
SearchOption.TopDirectoryOnly).Length;

Anaga
fuente
2
int filesCount = Directory.EnumerateFiles(Directory).Count();
Josue Martinez
fuente
-1

Para obtener el recuento de ciertas extensiones de tipo usando LINQ , puede usar este simple código:

Dim exts() As String = {".docx", ".ppt", ".pdf"}

Dim query = (From f As FileInfo In directory.GetFiles()).Where(Function(f) exts.Contains(f.Extension.ToLower()))

Response.Write(query.Count())
Wessam El Mahdy
fuente