Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Найдите количество файлов с определенным расширением во всех подкаталогах
Есть ли способ найти количество файлов определенного типа без необходимости перебирать все результаты с помощью Directory.GetFiles() или аналогичного метода? Я ищу что-то вроде этого:
int ComponentCount = MagicFindFileCount(@"c:\windows\system32", "*.dll");
Я знаю , что могу сделать рекурсивную функцию для вызова Directory.GetFiles, но было бы намного чище, если бы я мог сделать это без всех итераций.
EDIT: если это невозможно сделать без рекурсии и повторения самого себя, то как это лучше всего сделать?
Вы должны использовать Directory.GetFiles(path, searchPattern, SearchOption) перегрузку Directory.GetFiles().
Path указывает путь, searchPattern указывает ваши подстановочные знаки (например,*,*.format) и SearchOption предоставляет возможность включить подкаталоги.
Свойство Length возвращаемого массива этого поиска обеспечит правильное количество файлов для вашего конкретного шаблона поиска и опции:
string[] files = directory.GetFiles(@"c:\windows\system32", "*.dll", SearchOption.AllDirectories);
return files.Length;
EDIT: в качестве альтернативы вы можете использовать метод Directory.EnumerateFiles
return Directory.EnumerateFiles(@"c:\windows\system32", "*.dll", SearchOption.AllDirectories).Count();
Вы можете использовать эту перегрузку GetFiles:
а этот член SearchOption:
AllDirectories -включает текущий каталог и все подкаталоги в ходе поисковой операции. Эта опция включает в себя точки повторного анализа, такие как смонтированные приводы и символические ссылки в системе поиск.
GetFiles возвращает массив строк, так что вы можете просто получить длину, которая является числом найденных файлов.
Я искал более оптимизированную версию. Поскольку я не нашел его, я решил закодировать его и поделиться им здесь:
public static int GetFileCount(string path, string searchPattern, SearchOption searchOption)
{
var fileCount = 0;
var fileIter = Directory.EnumerateFiles(path, searchPattern, searchOption);
foreach (var file in fileIter)
fileCount++;
return fileCount;
}
Все решения, использующие GetFiles/GetDirectories, являются довольно медленными, так как все эти объекты должны быть созданы. Используя перечисление, он не создает никаких временных объектов (FileInfo/DirectoryInfo).
дополнительную информацию смотрите в разделе Примечания http://msdn.microsoft.com/en-us/library/dd383571.aspx
При использовании рекурсии ваш MagicFindFileCount будет выглядеть следующим образом:
private int MagicFindFileCount( string strDirectory, string strFilter ) {
int nFiles = Directory.GetFiles( strDirectory, strFilter ).Length;
foreach( String dir in Directory.GetDirectories( strDirectory ) ) {
nFiles += GetNumberOfFiles(dir, strFilter);
}
return nFiles;
}
Хотя решение Джона могло быть и лучше.
У меня есть приложение, которое генерирует количество каталогов и файлов в Родительском каталоге. Некоторые каталоги содержат тысячи вложенных каталогов с тысячами файлов в каждом. Для этого при сохранении отзывчивого пользовательского интерфейса я делаю следующее ( отправляя путь к ADirectoryPathWasSelected методу):
public class DirectoryFileCounter
{
int mDirectoriesToRead = 0;
// Pass this method the parent directory path
public void ADirectoryPathWasSelected(string path)
{
// create a task to do this in the background for responsive ui
// state is the path
Task.Factory.StartNew((state) =>
{
try
{
// Get the first layer of sub directories
this.AddCountFilesAndFolders(state.ToString())
}
catch // Add Handlers for exceptions
{}
}, path));
}
// This method is called recursively
private void AddCountFilesAndFolders(string path)
{
try
{
// Only doing the top directory to prevent an exception from stopping the entire recursion
var directories = Directory.EnumerateDirectories(path, "*.*", SearchOption.TopDirectoryOnly);
// calling class is tracking the count of directories
this.mDirectoriesToRead += directories.Count();
// get the child directories
// this uses an extension method to the IEnumerable<V> interface,
// which will run a function on an object. In this case 'd' is the
// collection of directories
directories.ActionOnEnumerable(d => AddCountFilesAndFolders(d));
}
catch // Add Handlers for exceptions
{
}
try
{
// count the files in the directory
this.mFilesToRead += Directory.EnumerateFiles(path).Count();
}
catch// Add Handlers for exceptions
{ }
}
}
// Extension class
public static class Extensions
{
// this runs the supplied method on each object in the supplied enumerable
public static void ActionOnEnumerable<V>(this IEnumerable<V> nodes,Action<V> doit)
{
foreach (var node in nodes)
{
doit(node);
}
}
}