使用文件名有效地检索和过滤文件

时间:2014-09-01 15:25:40

标签: c#

我是新手,我尝试使用文件名来检索文件,文件名具有以下定义:

项目编号+修订版+批号.pdf

例如:

  • 1109093-A2(85806S).pdf
  • 1109093-A3(85806S).pdf
  • 1109092-A1(85806S).pdf
  • 1109092-A2(85806S).pdf

此示例文件:1109093-A2(85806S).pdf

  • 料号:1109093
  • 修订:-A2
  • 最终产品编号:(85806S)

对于我的搜索结果,我只想拥有这些文件。

  • 1109093-A3(85806S).pdf
  • 1109092-A2(85806S).pdf

    我必须只有文件,实际的版本就像那里的文件(A3,A2)。

  • 但它不是,现在我仍然得到所有文件,我怎么能按修订版排序呢???

A1,A2,A3,A ....(修订版)代表我应该使用的选择标准。我为这份工作写了以下函数。

private string[] GetFiles()
{
    strSourcePath = textBox1.Text;
    strTargetPath = textBox2.Text;
    string fileName = string.Empty;
    strExtension =  "*).pdf";
    string[] files = null;

    if (Directory.Exists(strSourcePath))
    {
        files = Directory.GetFiles(strSourcePath, strExtension, SearchOption.AllDirectories); 

        var Result = "";

        string joined = String.Join("# ", Result);
        files = null;

        Result = joined.Split('#'); 
        files = Result.Where(file => Regex.IsMatch(Path.GetFileName(file), "^[0-9]+")).ToArray();
    }
    else
    {
        MessageBox.Show("Source path does not exist!");
    }

    return files ;
}

2 个答案:

答案 0 :(得分:0)

获得路径后,您可以解析文件名,提取修订版本等,并根据您的标准进行排序。

此代码解析为匿名类(为了便于阅读)并基于ItemNumber,Revision进行排序。

匿名类包含路径和项目编号/修订/结束编号信息。

请参阅演示以获取完整示例

var paths = new [] {
    "1109093-A2 (85806S).pdf",
    "1109093-A3 (85806S).pdf",
    "1109092-A1 (85806S).pdf",
    "1109092-A2 (85806S).pdf", 
};

var result = paths.Select(x => {
        var match = Regex.Match(x, @"(?<ItemsNumber>\d+)-(?<Revision>\w+)\s+\((?<EndItemNumber>\w+)\).pdf");
        if (match.Success)
        {
            return new { ItemNumber = match.Groups[1].Value, Revision = match.Groups[2].Value, EndItemNumber = match.Groups[3].Value, Path = x };
        }
        else {
            return new { ItemNumber = "", Revision = "", EndItemNumber = "", Path = x };
        }
    })
    .OrderBy(x => x.ItemNumber).ThenBy(x => x.Revision);

演示:https://dotnetfiddle.net/47uZni

答案 1 :(得分:0)

使用你的模板我编写了这个函数,但返回值总是相同的 - 一个项目,但不是我预期的列表。我不知道为什么。你有什么想法吗?

 private string[] SortFileName(string []TemP)
    {
        var paths = GetTheFileName(TemP);
        List<string> TheCollection = new List<string>();

        var result = paths.Select(x => {
            var match = Regex.Match(x, @"(?<ItemsNumber>\d+)-(?<Revision>\w+)\s+\((?<EndItemNumber>\w+)\).pdf");
            if (match.Success)
            {
                return new { ItemNumber = match.Groups[1].Value, Revision = match.Groups[2].Value, EndItemNumber = match.Groups[3].Value, Path = x };
            }
            else {
                return new { ItemNumber = "", Revision = "", EndItemNumber = "", Path = x };
            }
        })
        .GroupBy(x => x.ItemNumber)
        .Select(x => x.OrderByDescending(y => y.Revision).First());

            foreach (var item in result)
            {

                TheCollection.Add(item.Path.ToString());

            }

    return TheCollection.ToArray();
    }

PS:GetTheFileName(TemP);返回一个包含超过130个项目的数组。感谢您的帮助。