如何使用c#计算文件系统中一个文件夹中相似名称文件的数量?

时间:2010-02-05 16:20:20

标签: c# linq

要获取文件的详细信息,Directory.Getfiles(“DirectoryPath”,“* .zip”)将返回目录中的所有文件。每个文件在文件名中都有一个DateTime标记作为后缀:

  

e.g。   {87fbf03b-ec94-44a0-aac5-ffbaf6416700} _20100204_145154634008919142146021.zip

我从上面的文件名中拆分GUID。

string filName = Path.GetFileNameWithoutExtension(testFile).Split('_')[0];

这个解释只是告诉大家,那就是我如何在同一目录中拥有多个同名文件。

现在我的问题是如何在T-SQL中获得与Group by query相同的结果?我需要知道该目录中有多少次类似的文件名。

通过linq可以吗?是的,怎么样?

3 个答案:

答案 0 :(得分:2)

当然,请使用Enumerable.GroupBy

var groups = from f in Directory.GetFiles("DirectoryPath", "*.zip")
             group f by f.Split('_')[0] into g
             select new {
                 GUID = g.Key
                 Count = g.Count()
             };
foreach(var group in groups) {
    Console.WriteLine("Guid = {0}: Count = {1}", group.GUID, group.Count);
}

它读得非常好。

由于您在评论中指定不能使用LINQ:

Dictionary<string, int> dict = new Dictionary<string, int>();
foreach(string filename in Directory.GetFiles("DirectoryPath", "*.zip")) {
    string guid = filename.Split('_')[0];
    if(!dict.ContainsKey(guid)) {
        dict.Add(guid, 0);
    }
    dict[guid]++;
}

foreach(KeyValuePair<string, int> kvp in dict) {
    Console.WriteLine("Guid = {0}: Count = {1}", kvp.Key, kvp.Value);
}

答案 1 :(得分:1)

试试这个(未经测试):

IList<string> fileNames = ...
var result = from fileName in fileNames
             group fileName by fileName.Split('_')[0] into grp
             select new
             {
                 FileName = grp.Key,
                 Count = grp.Count()
             };

答案 2 :(得分:1)

而不是字符串,你应该使用Guid类型。

var groups = from f in System.IO.Directory.GetFiles("DirectoryPath", "*.zip")
    group f by f.Split('_')[0] into g
    select new
    {
        GUID = new Guid(g.Key),
        Count = g.Count()
    };