计数文件扩展名C#

计数文件扩展名C#,c#,directory,C#,Directory,嗨,我是一个c#begginer,我想做一个简单的程序,通过一个文件夹,计算有多少个文件是.mp3文件,有多少是.flac文件 就像我说的,这个程序非常基本。它将询问音乐文件夹路径,然后再进行检查。我知道在主音乐文件夹中会有很多子文件夹,所以它必须一次打开一个子文件夹,并对它们进行检查 例如 音乐/ 将是给定的目录。 但它本身并不包含任何音乐。 要访问音乐文件,程序必须打开子文件夹,如 C:/Music/Electronic/deadmau5/AlbumTitle/ 只有这样,他才能计算.mp3

嗨,我是一个c#begginer,我想做一个简单的程序,通过一个文件夹,计算有多少个文件是.mp3文件,有多少是.flac文件

就像我说的,这个程序非常基本。它将询问音乐文件夹路径,然后再进行检查。我知道在主音乐文件夹中会有很多子文件夹,所以它必须一次打开一个子文件夹,并对它们进行检查

例如

音乐/ 将是给定的目录。 但它本身并不包含任何音乐。 要访问音乐文件,程序必须打开子文件夹,如

C:/Music/Electronic/deadmau5/AlbumTitle/ 只有这样,他才能计算.mp3文件和.flac文件,并将它们存储在两个单独的计数器中。 该程序将至少对2000个文件夹执行此操作

您知道一种检查文件并返回其名称(和扩展名)的好方法吗?

重复问题

乔恩·斯基特回答道

您不需要使用LINQ来执行此操作-它是:

或:

IEnumerable files=Directory.EnumerateFiles(目录“*.dll”,
SearchOption.AllDirectories);

老实说,LINQ在递归方面不是很好。您可能想编写自己的通用递归扩展方法。考虑到这类问题经常被问到,我真的应该自己找个时间来问…

你可以使用
System.IO.DirectoryInfo
DirectoryInfo
提供了一种方法,该方法还具有递归选项,因此,如果您不担心速度,可以执行以下操作:

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

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

使用
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);
}
C#有一个内置的方法来搜索所有子目录中的文件。确保为System.IO添加using语句

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

由于您是一名初学者,您应该将更灵活的LINQ方法推迟到以后使用。

MSDN提供了大量信息和示例,例如如何遍历目录:

这是MSDN支持页面

直接取自该页:

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

除了创建对象外,还可以使用此代码。一旦你有了文件信息对象,你可以检查属性,看看它是否与你关心的匹配。

忘记更改第二次搜索,仍然说*.mp3这是一个意识到我仍然是乞丐的地方,我真的不明白所有的答案。话虽如此,我真的很喜欢这种方法,这正是我所寻找的。多谢了,有没有一种方法可以比使用一个GetFile扩展名更有效?例如int numFLAC=di.GetFiles(“.flac”,“.alac”,SearchOption.AllDirectories).Length@PhaDaPhunk:我认为
*.flac |*.alac
应该有效,或者
*.flac;*。alac
。(很抱歉,现在无法测试。)@false您可以为使用单个GetFile的count多个扩展名提供代码吗?我尝试了“.doc;”.jpg”,但它返回零
int fileCount = Directory.GetFiles(_Path, "*.*", SearchOption.TopDirectoryOnly).Length
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);
    }
}
int fileCount = Directory.GetFiles(_Path, "*.*", SearchOption.TopDirectoryOnly).Length