8 ответов:
самый хитрый метод будет использовать 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;вы можете использовать это.
чтение PDF файлов из каталога:
var list = Directory.GetFiles(@"C:\ScanPDF", "*.pdf"); if (list.Length > 0) { }
попробуйте следующий код, чтобы получить количество файлов в папке
string strDocPath = Server.MapPath('Enter your path here'); int docCount = Directory.GetFiles(strDocPath, "*", SearchOption.TopDirectoryOnly).Length;
каталог методов .NET.GetFiles (dir) или DirectoryInfo.GetFiles () не очень быстры для получения общего количества файлов. Если вы используете этот метод подсчета файлов очень сильно, рассмотрите использование WinAPI напрямую, что экономит около 50% времени.
вот подход WinAPI, где я инкапсулирую вызовы WinAPI в метод C#:
int GetFileCount(string dir, bool includeSubdirectories = false)полный код:
[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; }когда я ищу в папке с 13000 файлов на моем компьютере-средний: 110ms
int fileCount = GetFileCount(searchDir, true); // using WinAPI.NET встроенный метод: каталог.GetFiles (dir) - средний: 230ms
int fileCount = Directory.GetFiles(searchDir, "*", SearchOption.AllDirectories).Length;Примечание: первый запуск любого из методов будет 60% - 100% медленнее соответственно, потому что жесткий диск занимает немного больше времени, чтобы найти сектора. Последующие вызовы будут частично кэшироваться Windows, я думаю.
чтобы получить количество определенных расширений типа с помощью LINQ вы можете использовать этот простой код:
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())
Comments