Recuento de archivos de una carpeta


80

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

Respuestas:


58
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;

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;

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();

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.


8

Leer archivos PDF de un directorio:

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

}

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.


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

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;



-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())
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.