Як отримати кількість файлів із папки за допомогою ASP.NET із C #?
Як отримати кількість файлів із папки за допомогою ASP.NET із C #?
Відповіді:
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;
Ви можете використовувати метод Directory.GetFiles
Також див. Метод Directory.GetFiles (String, String, SearchOption)
Ви можете вказати параметр пошуку в цьому перевантаженні.
TopDirectoryOnly : Включає лише поточний каталог у пошук.
AllDirectories : Включає поточний каталог та всі підкаталоги в операції пошуку. Цей параметр включає в себе точки повторного розбору, такі як змонтовані диски та символічні посилання в пошуку.
// 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;
Найбільш тонким методом буде використання LINQ :
var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
select file).Count();
GetFileстворення рядка [], який вимагав вільного місця в пам'яті. Будьте обережні :)
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)
{
}
Методи .NET Directory.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 файлами на своєму комп’ютері - середнє значення: 110 мс
int fileCount = GetFileCount(searchDir, true); // using WinAPI
Вбудований метод .NET: Directory.GetFiles (dir) - Середнє значення: 230 мс
int fileCount = Directory.GetFiles(searchDir, "*", SearchOption.AllDirectories).Length;
Примітка: перший запуск будь-якого з методів буде відповідно на 60% - 100% повільнішим, оскільки для пошуку секторів жорсткий диск займає трохи більше часу. Подальші дзвінки, напевно, будуть кешовані Windows.
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
int filesCount = Directory.EnumerateFiles(Directory).Count();
Щоб отримати кількість певних розширень типу за допомогою 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())