Счетчик файлов из папки

80

Как получить количество файлов из папки с помощью ASP.NET с C #?

Шриджеш Кумар
источник

Ответы:

58
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;
X4lldux
источник
3
Что происходит, если в каталоге содержится больше файлов int.MaxValue?
Мел Герац
2
Чтобы получить более современное решение, которое требует меньших ресурсов, замените GetFiles () на EnumerateFiles () и Length на Count ()
relative_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?
Эриберто Луго
Чтобы получить более современное решение, которое требует меньших ресурсов, замените GetFiles () на EnumerateFiles () и Length на Count ()
relative_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
Я рекомендовал этот метод в случае огромных коллекций файлов. Такой подход экономит память. Метод GetFilecreate string [], который требует плоского пространства памяти. Будьте осторожны :)
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").
Стефан Мейер
@StefanMeyer Нет, если вы воспользуетесь этим списком позже ...
Guille Bauza
@GuilleBauza Вопрос состоял в том, чтобы считать файлы PDF, а не использовать их;)
Стефан Мейер
Да, но какой смысл считать, если ты не будешь его использовать ...
Гий Бауза
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.

детали
источник
Отличное решение, но чтобы заставить его работать, я рекомендую следующее редактирование: |||||||||||| добавить public static long fileCount = 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;

анагха
источник
2
int filesCount = Directory.EnumerateFiles(Directory).Count();
Хосуэ Мартинес
источник
-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())
Вессам Эль Махди
источник