C# 文件预测程序

C# 文件预测程序,c#,.net,regex,C#,.net,Regex,我有一个xml配置文件,文件格式如下: <FILE FILEFORMAT="|PREFIX|DATETIME|-|STRING|NUMBER|_|DATETIME2|-|TIME|SUFFIX|" /> <FILE FILEFORMAT="|PREFIX|NUMBER|_|DATETIME|-|TIME|SUFFIX|" /> <FILE FILEFORMAT="|DATETIME|_|PREFIX|_|STRING|_|DATETIME2|-|TIME|SU

我有一个xml配置文件,文件格式如下:

 <FILE FILEFORMAT="|PREFIX|DATETIME|-|STRING|NUMBER|_|DATETIME2|-|TIME|SUFFIX|" />
 <FILE FILEFORMAT="|PREFIX|NUMBER|_|DATETIME|-|TIME|SUFFIX|" />
 <FILE FILEFORMAT="|DATETIME|_|PREFIX|_|STRING|_|DATETIME2|-|TIME|SUFFIX|" />
 <FILE FILEFORMAT="|PREFIX|_|STRING|_|STRING2|_|DATETIME|_|DATETIME2|-|TIME|SUFFIX|"/>

我要做的是检查文件名是否符合指定的格式,有多个不同格式的客户端,我不知道如何去解决这个难题,非常感谢任何帮助。基本上,我们的想法是,如果将来有更多的文件出现,不要触及编程方面,将它们的信息添加到配置文件就足够了。

我不确定您到底需要什么,但是如果这是一种描述文件名模式的方法,您应该简单地使用正则表达式

然后,您只需在所有格式之间循环

下面是一个如何进行搜索的示例(假设您已将xml格式加载到formats中,将搜索目录加载到dir中)

Dictionary formatDic=new Dictionary();
foreach(格式中的XElement curFormat)
{
格式。添加(
curFomat.Attribute(“名称”),
新的正则表达式(curFomat.Attribute(“FILEFORMAT”),RegexOptions.Compiled);
}
foreach(dir.GetFiles()中的FileInfo curFile)
{
尝试
{
控制台写入线(
“文件:{0}的类型为:{1}”,
curFile.FullName,
(由c改为c)
其中c.Value.IsMatch(curFile.FullName)
选择c.Key).Single();
}
抓住
{
WriteLine(“在文件{0}上发生错误”,curFile.FullName);
}
}

有关regexp的详细信息:

如果要执行此操作,至少需要以下内容:

  • 定义模式组件的某种方式(例如,
    DATETIME
    等)
  • 定义如何验证这些组件的某种方法(即,使“20110956”不被视为有效日期)
  • 定义要识别的模式的某种方法(即从字符串中解析各个组件)
您可能可以使用正则表达式执行第一个和第三个操作。在一般情况下,您无法执行第二个操作。如果您添加了新类型的组件,则必须编写代码对其进行验证

最简单的说,您试图构建的是一个正则表达式生成器,它可以将不同组件的正则表达式组合成一个定义特定模式的正则表达式。您真正构建的是一个解析器生成器,我怀疑您是否需要这样做

您还必须非常小心歧义。例如,假设您有以下两种格式:

PREFIX|DATETIME|-|NUMBER|SUFFIX
PREFIX|NUMBER|-|DATETIME|SUFFIX
由于您的
DATETIME
的格式可能是
20110315
,因此很容易将其解释为一个数字。例如:

xyz20110315-20041231.txt
哪个是日期,哪个是号码

我看不出您所展示的模式中有任何明显的问题,但我可以很容易地预见,当您希望添加新格式时,将来会遇到问题。您将遇到冲突

此外,如果正则表达式的数量增长非常大,那么根据所有这些正则表达式检查大量传入文件将非常非常昂贵

在我看来,拥有这样一个通用的文件名分类方案的好处永远不值得你花时间来构建和维护它。因为它需要维护。事实上,你可能会发现每次你有新客户时都会对它进行调整


因此,只需编写最简单的代码即可。用代码编写,并在获得新文件类型时自行修改。

为什么要将分隔文件格式与XML混合使用?@恶心-我认为这是他们描述文件名需要标记化的方式。如果这些文件名应该是@M.Babcock之类的输入掩码,则建议您我可能会用正则表达式来描述它们,而不是这里的内容名称不同部分之间的区别字符到目前为止,您尝试过哪些正则表达式?我已经编写了整个程序,但是高级管理层想要XML实现,我猜他们对太多的switch case语句感到恼火。为不同的文件格式构建正则表达式。(?:[a-z][a-z0-9\]*)批处理\d+\d+-\d+\(?:[a-z][a-z]+)但是,对于类型“SUXX20111101-BATCH2240_20111113-091322.txt”,您应该检查regexp是否只捕获一种格式。
PREFIX|DATETIME|-|NUMBER|SUFFIX
PREFIX|NUMBER|-|DATETIME|SUFFIX
xyz20110315-20041231.txt