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 directoryint fCount = Directory.GetFiles(path, "*", SearchOption.AllDirectories).Length;
// searches the current directoryint fCount = Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly).Length;
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;
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 #:
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 directriesint fileCount = Directory.GetFiles(path, "*.*", SearchOption.TopDirectory).Length; // Will Retrieve count of all files in directry but not sub directriesint fileCount = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories).Length; // Will Retrieve count of files XML extension in directry and sub directries
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())
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;
fuente
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();
fuente
GetFile
crea la cadena [] que requiere espacio de memoria plana. Tenga cuidado :)System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath"); int count = dir.GetFiles().Length;
Puedes usar esto.
fuente
Leer archivos PDF de un directorio:
var list = Directory.GetFiles(@"C:\ScanPDF", "*.pdf"); if (list.Length > 0) { }
fuente
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.
fuente
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
fuente
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;
fuente
int filesCount = Directory.EnumerateFiles(Directory).Count();
fuente
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())
fuente