Кількість файлів із папки


Відповіді:


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

3
Яка поведінка, якщо каталог містить більше, ніж файли int.MaxValue?
Mel Gerats,

2
Для вирішення більш останню дату , яка легше на ресурси, замінити GetFiles () від EnumerateFiles () і довжину від Count ()
relatively_random

128

Ви можете використовувати метод 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;

Чи можу я запропонувати використовувати "*" для пошуку файлів, інакше файли без розширень не включатимуться до підрахунку.
Нік Булл

Здається, це включає кількість підпапок. Тобто у мене є одна підпапка і в іншому порожньому каталозі, і це повертає 1.
Будьте добрими до нових користувачів

@MichaelPotter чи можливо, що він рахував desktop.ini?
Heriberto Lugo

Для вирішення більш останню дату , яка легше на ресурси, замінити GetFiles () від EnumerateFiles () і довжину від Count ()
relatively_random

22

Найбільш тонким методом буде використання LINQ :

var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
                        select file).Count();

5
Ви можете просто написати: var fileCount = Directory.EnumerateFiles (@ "H: \ iPod_Control \ Music", "* .mp3", SearchOption.AllDirectories) .Count ();
AndrewS

1
Я рекомендував цей метод у випадку величезних колекцій файлів. Такий підхід дозволяє економити пам’ять. Метод GetFileстворення рядка [], який вимагав вільного місця в пам'яті. Будьте обережні :)
hsd,

15
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath");
int count = dir.GetFiles().Length;

Ви можете використовувати це.


8

Читання PDF-файлів з каталогу:

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

}

Необов’язково визначення списку. Це повинно зробити роботу: якщо Directory.Getfiles (@ "C: \ ScanPDF", "* .pdf"). Count> 0
Stefan Meyer

@StefanMeyer Ні, якщо ти збираєшся використовувати цей список пізніше ...
Guille Bauza

@GuilleBauza Питання полягало в тому, щоб підрахувати файли PDF, а не використовувати їх;)
Stefan Meyer

Так, але який сенс рахувати, якщо ти не будеш цим користуватися ...
Гій Бауза

3

Методи .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.


Чудовий вирішення, але для його роботи я рекомендую наступне редагування: |||||||||||| додати загальнодоступний статичний довгий файлCount = 0; |||||||||||| // int fileCount = 0; // коментар
Маркус

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

Спробуйте наступний код, щоб отримати кількість файлів у папці

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



-1

Щоб отримати кількість певних розширень типу за допомогою 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())
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.