Recuento de archivos de una carpeta

¿Cómo obtengo el número de archivos de una carpeta usando ASP.NET con C #?

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

Puede usar el método Directory.GetFiles

También vea 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; 

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

 var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories) select file).Count(); 
 System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath"); int count = dir.GetFiles().Length; 

Puedes usar esto

Lectura de archivos PDF desde un directorio:

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

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

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

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

Aquí está el enfoque de WinAPI donde encapsulo 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á 60% – 100% más lenta, respectivamente, porque el disco duro tarda un poco más en localizar los sectores. Las llamadas subsecuentes serán semi-almacenadas en caché por Windows, supongo.

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

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