文件预测程序
本文关键字:程序 文件 | 更新日期: 2023-09-27 18:19:12
我有一个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|"/>
其中前缀只是字母,datetime/datetime2只是数字,而不是实际的日期时间类型(稍后我会将其转换为datetime),字符串是另一个字母表,数字是0到9个数字,时间也是数字,后缀是文件格式,如。xml或。txt。
实际文件示例:
`SUXX20111101-BATCH2240_20111113-091322.txt` `TOBEME826908_20111113-091413.txt` `2011-12-01_MYSELF_ANDI_20111208-121517.txt` `WELL_MAYBENOT_TRUE_092011_20111215-022931.txt`
我要完成的是检查文件名是否按照指定的格式,有多个不同格式的客户端,我不知道如何去解决这个难题,非常感谢任何帮助。基本的想法是,如果将来有更多的文件出现,不触及编程方面,将它们的信息添加到配置文件中应该足够了。
我不确定你到底需要什么,但是如果它是一种描述文件名模式的方法,你应该简单地使用正则表达式。
然后你只需要在所有格式之间循环。
下面是一个如何进行搜索的示例(假设您已经在format中加载了xml格式,在dir中加载了搜索目录)
Dictionary<string, Regex> formatDic = new Dictionary<string, Regex>();
foreach(XElement curFormat in formats)
{
formats.Add(
curFomat.Attribute("NAME"),
new Regex(curFomat.Attribute("FILEFORMAT"), RegexOptions.Compiled));
}
foreach(FileInfo curFile in dir.GetFiles())
{
try
{
Console.WriteLine(
"File : {0} is of type : {1}",
curFile.FullName,
(from c in formatDic
where c.Value.IsMatch(curFile.FullName)
select c.Key).Single());
}
catch
{
Console.WriteLine("Error occuring on file : {0}", curFile.FullName);
}
}
有关regexp的更多信息:MSDN上的正则表达式
如果您想这样做,您至少需要以下内容:
- 定义模式组件(如
DATETIME
等)的某种方法 - 定义如何验证这些组件的某种方法(例如,"20110956"不被认为是有效日期)。
- 一种定义你想要识别的模式的方法(即从字符串中解析单个组件)。
您可能能够使用正则表达式执行第一和第三个操作。一般情况下,你不能做第二件事。如果您添加了一个新类型的组件,您将不得不编写代码来验证它。
看起来你试图构建的是,最简单的,一个正则表达式构建器,它可以将不同组件的正则表达式组合成一个定义特定模式的正则表达式。您真正构建的是一个解析器生成器,我怀疑您是否需要这样做。
你还必须非常小心歧义。例如,假设您有以下两种格式:
PREFIX|DATETIME|-|NUMBER|SUFFIX
PREFIX|NUMBER|-|DATETIME|SUFFIX
因为看起来你的DATETIME
可以是20110315
的形式,它可以很容易地被解释为一个数字。例如,给定:
xyz20110315-20041231.txt
哪个是日期,哪个是号码?
在您所展示的模式中我没有看到任何明显的问题,但是我可以很容易地想象将来当您想要添加新格式时遇到的问题。你将遇到冲突。
同样,如果你的正则表达式的数量增长得非常大,根据所有这些正则表达式检查大量传入文件将会非常非常昂贵。
在我看来,拥有这样一个通用的文件名分类方案的好处永远不值得花费时间来构建和维护它。因为它需要维护。事实上,你可能会发现每次你得到一个新客户,你都在调整它。
那就尽量写最简单的东西。在代码中完成,并在获得新文件类型时修改它。