统计文件扩展名 C#

5

你好,我是一名C#初学者,希望能够编写一个简单的程序,遍历一个文件夹并计算其中有多少个MP3文件和FLAC文件。

正如我所说,这个程序非常基础。它将要求输入音乐文件夹的路径,然后进行遍历。我知道在这个主音乐文件夹中会有许多子文件夹,因此它将逐个打开它们并进行遍历。

例如:

C:/Music/ 这是给定的目录。 但是它本身不包含任何音乐。 要获取音乐文件,程序必须打开子文件夹,例如

C:/Music/Electronic/deadmau5/RandomAlbumTitle/ 只有这样才能计算.mp3文件和.flac文件,并将它们存储在两个独立的计数器中。 该程序需要至少遍历2000个文件夹。

你是否知道一种好的方法或方式来遍历文件并返回其名称(和扩展名)?

7个回答

9

你可以使用 System.IO.DirectoryInfoDirectoryInfo 提供了一个 GetFiles 方法,该方法还具有递归选项,因此如果您不担心速度问题,可以这样做:

DirectoryInfo di = new DirectoryInfo(@"C:\Music");

int numMP3 = di.GetFiles("*.mp3", SearchOption.AllDirectories).Length;
int numFLAC = di.GetFiles("*.flac", SearchOption.AllDirectories).Length;

忘记更改第二个搜索,仍然显示*.mp3。 - Dharun
这就是我意识到自己仍然是一个初学者的地方,我真的不理解所有的答案。 话虽如此,我真的很喜欢这种方法,这正是我一直在寻找的。 非常感谢。 - phadaphunk
有没有办法使用单个GetFile计算多个扩展名的数量? 例如:int numFLAC = di.GetFiles(".flac",".alac", SearchOption.AllDirectories).Length; - phadaphunk
@PhaDaPhunk:我认为 *.flac|*.alac 应该可以工作,或者是 *.flac;*.alac。 (抱歉,现在无法测试。) - Ry-
@false,你能提供一段代码来计算多个扩展名的文件数量吗?我已经尝试了“*.doc;*.jpg”,但是它返回零。 - Nagaraj S
@NagarajS:将这些数字相加。 - Ry-

7
使用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);
}

2

C#内置了一种方法,可以在所有子目录中搜索文件。请确保添加System.IO的using语句。

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

由于你是初学者,应该等到后面再使用更为灵活的LINQ方法。


1
int fileCount = Directory.GetFiles(_Path, "*.*", SearchOption.TopDirectoryOnly).Length

0

重复问题 如何使用LINQ递归地读取子文件夹中的文件名

Jon Skeet在那里回答说

您不需要使用LINQ来完成这个操作 - 它已经内置到框架中了:

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

或者如果您正在使用.NET 4

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

说实话,LINQ 在递归方面并不是很好。你可能想要编写自己的通用递归扩展方法。考虑到这种问题经常被问到,我应该抽时间自己去做一下...

0

这是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属性,以查看它是否与您关心的匹配。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接