我有一个包含两个文件的文件夹:
此外,第三方应用程序按如下方式处理文件:
folderPath
和searchPattern
Directory.GetFiles(folderPath, searchPattern)
,处理与批量过滤器匹配的任何文件,然后将文件移动到存档文件夹。事实证明,我必须将我的两个文件移动到不同的存档文件夹中,因此我需要通过提供不同的searchPatterns来单独选择它们来单独处理它们。请注意,我无法修改第三方应用,但我可以修改数据库中的searchPattern和文件目的地。
searchPattern
允许我在不包含Awesome.File.20091031_123002.txt
的情况下选择Awesome.File.Summary.20091031_123152.txt
的内容是什么?
答案 0 :(得分:9)
如果您打算使用LINQ,那么......
var regexTest = new Func<string, bool>(i => Regex.IsMatch(i, @"Awesome.File.(Summary)?.[\d]+_[\d]+.txt", RegexOptions.Compiled | RegexOptions.IgnoreCase));
var files = Directory.GetFiles(@"c:\path\to\folder").Where(regexTest);
答案 1 :(得分:8)
Awesome.File。???????? _ ??????。TXT
问号(?)充当单个字符占位符。
答案 2 :(得分:6)
我想在这里尝试我微薄的linq技能......我确信有更优雅的解决方案,但这是我的:
string pattern = ".SUMMARY.";
string[] awesomeFiles = System.IO.Directory.GetFiles("path\\to\\awesomefiles");
IEnumerable<string> sum_files = from file in awesomeFiles
where file.ToUpper().Contains(pattern)
select file;
IEnumerable<string> other_files = from file in awesomeFiles
where !file.ToUpper().Contains(pattern)
select file;
这假设目录中除了两个文件之外没有任何其他文件,但您可以在此处调整模式以满足您的需要(即将“Awesome.File”添加到模式开始。)
当你迭代每个的集合时,你应该得到你需要的东西。
答案 3 :(得分:5)
根据documentation, searchPattern 仅支持*****和?通配符。您需要编写自己的正则表达式过滤器,该过滤器获取Directory.GetFiles的结果并应用进一步的过滤逻辑。
答案 4 :(得分:0)
如果你不想使用Linq,可以单程。
public void FileChecker(string filePath)
{
DirectoryInfo di = new DirectoryInfo(filePath);
int _MatchCounter;
string RegexPattern = "^[a-zA-Z_a-zA-Z_a-zA-Z_0-9_0-9_0-9.csv]*$";
Regex RegexPatternMatch = new Regex(RegexPattern, RegexOptions.IgnoreCase);
foreach (FileInfo matchingFile in di.GetFiles())
{
Match m = RegexPatternMatch.Match(matchingFile.Name);
if ((m.Success))
{
MessageBox.Show(matchingFile.Name);
_MatchCounter += 1;
}
}
}