我有一个从指定文件夹中读取文件的功能。它使用xml文件获取文件名及其路径。当文件名是Finance.csv时,它工作正常,但现在要求已更改,文件名具有时间戳记(Finance_May2016.csv),并且配置文件具有以下内容
<filename>Finance_{Date:mmmYYYY}.csv <\filename>
<Path> C:\folder <\Path>
到目前为止,我有这个
public string GetFullName(string source, string path)
{
string formatPrefix = "Date";
string regex = string.Format("{{{0}(:([^}}]*))?}}", formatPrefix);
string replacement = @"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\d{4}";
Regex rgx = new Regex(regex);
string result = rgx.Replace(source, replacement);
FileInfo[] filePath = new DirectoryInfo(path).GetFiles();
var Filename = filePath.FirstOrDefault().Name;
var matches = Regex.Matches(Filename, result);
if (matches.Count == 1)
{
return Filename;
}
return "";
}
因此,这里我从配置文件中传递文件名和路径,并比较文件夹中是否有与DateTime
配置文件中设置的名称和格式匹配的文件。到目前为止,它仍然有效,但是由于正则表达式是硬编码的,因此它仅搜索mmmYYYY
日期格式,如果在配置文件中设置了新的文件名格式(如),该怎么办{Date:ddmmyyyy}_Finance.csv
?当前的正则表达式将无法正常工作。
我的问题在这里,还有其他更优雅的方式来实现这一目标吗?我尝试使用Directory.Getfiles()
一些搜索模式过滤器,但是没有运气。
在此先感谢您的任何信息
从上面的代码中,您正在寻找带有FinanceMMMyyyy.csv模式的文件。然后,您检索找到的第一个文件。以下代码更具可读性。由于这个原因,我想避免使用正则表达式。
using System;
using System.IO;
var MONTH_CHARS = 3;
var YEAR_CHARS = 4;
var FILE_NAME = "Finance";
string filePattern = @"Finance*.csv";
string path = @"c:\temp\";
foreach (var filePath in Directory.GetFiles(path, filePattern))
{
var startIndex = FILE_NAME.Length;
var fileName = Path.GetFileName(filePath);
var month = fileName.Substring(startIndex, MONTH_CHARS);
var year = fileName.Substring(startIndex + MONTH_CHARS, YEAR_CHARS);
Console.WriteLine(fileName + "," + month + year);
if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year)) continue;
//Check for proper month and year here
resultingFileName = fileName;
break;
}
Console.WriteLine(resultingFileName);
对于日期在文件名开头的情况,可以执行以下操作:
var MONTH_CHARS = 2;
var YEAR_CHARS = 4;
var FILE_NAME = "Finance";
string filePattern = @"*Finance.csv";
string path = @"c:\temp\";
var resultingFileName = "";
var startIndex = 0;
foreach (var filePath in Directory.GetFiles(path, filePattern))
{
var fileName = Path.GetFileName(filePath);
var year = fileName.Substring(startIndex , YEAR_CHARS);
var month = fileName.Substring(YEAR_CHARS, MONTH_CHARS);
var endingFileName = fileName.Substring(YEAR_CHARS + MONTH_CHARS);
if (string.IsNullOrEmpty(month) || string.IsNullOrEmpty(year) ||
string.IsNullOrEmpty(endingFileName)) continue;
//Check for proper month and year here
resultingFileName = fileName;
break;
}
Console.WriteLine(resultingFileName);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句