Подсчет файлов расширений C # - PullRequest
4 голосов
/ 26 февраля 2012

Привет, я новичок в c #, и я хотел бы создать простую программу, которая будет проходить через папку и подсчитывать, сколько файлов .mp3 и сколько .flac.

Как я уже сказал, программа очень проста. Он запросит путь к папке с музыкой, а затем пройдет через нее. Я знаю, что в этой основной музыкальной папке будет много подпапок, поэтому придется открывать их по одной и просматривать их тоже.

* 1005 например *

C: / Музыка / будет данный каталог. Но в нем нет музыки. Для доступа к музыкальным файлам программа должна открывать подпапки, такие как

C: / Музыка / Электронная / deadmau5 / RandomAlbumTitle / Только тогда он может считать файлы .mp3 и .flac и хранить их в двух отдельных счетчиках. Программа должна сделать это как минимум для 2000 папок.

Знаете ли вы хороший способ или метод, чтобы просмотреть файлы и вернуть их имя (и расширение)?

Ответы [ 7 ]

7 голосов
/ 26 февраля 2012

Используйте DirectoryInfo и группируйте по расширению файла:

var di = new DirectoryInfo(@"C:/Music/");
var extensionCounts = di.EnumerateFiles("*.*", SearchOption.AllDirectories)
                        .GroupBy(x => x.Extension)
                        .Select(g => new { Extension = g.Key, Count = g.Count() })
                        .ToList();

foreach (var group in extensionCounts)
{
    Console.WriteLine("There are {0} files with extension {1}", group.Count, 
                                                                group.Extension);
}
7 голосов
/ 26 февраля 2012

Вы можете использовать System.IO.DirectoryInfo.DirectoryInfo предоставляет метод GetFiles, который также имеет рекурсивную опцию, поэтому, если вас не беспокоит скорость, вы можете сделать это:

2 голосов
/ 26 февраля 2012

C # имеет встроенный метод поиска файлов во всех подкаталогах.Убедитесь, что вы добавили оператор использования для System.IO

var path = "C:/Music/"
var files = Directory.GetFiles(path, "*.mp3", SearchOption.AllDirectories);
var count = files.Length;

Поскольку вы новичок, вам следует придерживаться более гибкого метода LINQ до более поздней версии.

0 голосов
/ 24 июля 2013
int fileCount = Directory.GetFiles(_Path, "*.*", SearchOption.TopDirectoryOnly).Length
0 голосов
/ 26 февраля 2012

Вот страница поддержки MSDN, Как рекурсивно искать каталоги с помощью Visual C #

Взят прямо с этой страницы:

void DirSearch(string sDir) 
{
    try 
    {
       foreach (string d in Directory.GetDirectories(sDir)) 
       {
        foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
        {
           lstFilesFound.Items.Add(f);
        }
        DirSearch(d);
       }
    }
    catch (System.Exception excpt) 
    {
        Console.WriteLine(excpt.Message);
    }
}

Вы можете использовать этот код вдополнение к созданию FileInfo объектов.Как только у вас появятся объекты информации о файле, вы можете проверить свойство Extension , чтобы проверить, совпадает ли оно с теми, которые вам нужны.

0 голосов
/ 26 февраля 2012

MSDN содержит много информации и примеров, например, как вы можете перебирать каталог: http://msdn.microsoft.com/en-us/library/bb513869.aspx

0 голосов
/ 26 февраля 2012

Повторяющийся вопрос Как рекурсивно читать имена файлов из подпапки с помощью LINQ

Джон Скит ответил там с

Вам не нужно использовать LINQ для этого - он встроен в фреймворк :

string[] files = Directory.GetFiles(directory, "*.dll",
                                    SearchOption.AllDirectories);

или , если вы используете .NET 4 :

IEnumerable<string> files = Directory.EnumerateFiles(directory, "*.dll",
                                                    SearchOption.AllDirectories);

Если честно, LINQ не очень хорош в плане рекурсии. Возможно, вы захотите написать свой собственный метод рекурсивного расширения общего назначения. Учитывая, как часто задают такой вопрос, я действительно должен сам это сделать некоторое время ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...