使用 C# 在目录中查找丢失的文件名
Find Missing File Names in directory using c#
我有一个目录,预计有 21 个文件,范围从 0 到 20。文件以下划线和 0 到 20 之间的数字结尾(可能是 _01 或 _1 格式),命名约定如下:
DirectoryName_00.txt, DirectoryName_01.txt,..., DirectoryName_20.txt
Or
DirectoryName_0.txt, DirectoryName_1.txt,..., DirectoryName_20.txt
我想找出现在丢失的文件我正在使用以下代码片段:
for (int pageNum = 0; pageNum <= 20; pageNum++)
{
//templateFiles is list of files in that directory
string expectedTemplateName = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00"));
templateFiles.Any(file => file.Equals(expectedTemplateName, StringComparison.OrdinalIgnoreCase));
}
但是通过这种方法,我只能搜索格式为 00,01,02,03...20 的文件,无法搜索格式为 0,1,2,3...20 的文件。
有什么简短的方法可以让我搜索两种格式的文件(可能使用 RegEx)。
做两次,
for (int pageNum = 0; pageNum <= 20; pageNum++)
{
//templateFiles is list of files in that directory
string expectedTemplateName1 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString());
string expectedTemplateName2 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00"));
templateFiles.Any(file =>
(file.Equals(expectedTemplateName1, StringComparison.OrdinalIgnoreCase) ||
file.Equals(expectedTemplateName2, StringComparison.OrdinalIgnoreCase)));
}
像这样:
var re = new Regex("_[\d].");
var resultedFiles = templateFiles.Where(x => re.IsMatch(x));
在这种情况下,正则表达式可能不是最好的工具,这就是为什么我会直接使用@kennyzx 的直接方法。如果你非常想使用正则表达式,你可以使用以下内容;但请注意,这比直接字符串比较慢 >800%——而且也不一定更容易理解。
for (int pageNum = 0; pageNum <= 20; pageNum++)
{
var regex = new Regex(string.Format(@"^{0}_(?:{1}|{1:00})\.txt$", directoryName, pageNum), RegexOptions.IgnoreCase);
templateFiles.Any(file => regex.IsMatch(expectedTemplateName, StringComparison.OrdinalIgnoreCase));
}
我有一个目录,预计有 21 个文件,范围从 0 到 20。文件以下划线和 0 到 20 之间的数字结尾(可能是 _01 或 _1 格式),命名约定如下:
DirectoryName_00.txt, DirectoryName_01.txt,..., DirectoryName_20.txt
OrDirectoryName_0.txt, DirectoryName_1.txt,..., DirectoryName_20.txt
我想找出现在丢失的文件我正在使用以下代码片段:
for (int pageNum = 0; pageNum <= 20; pageNum++)
{
//templateFiles is list of files in that directory
string expectedTemplateName = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00"));
templateFiles.Any(file => file.Equals(expectedTemplateName, StringComparison.OrdinalIgnoreCase));
}
但是通过这种方法,我只能搜索格式为 00,01,02,03...20 的文件,无法搜索格式为 0,1,2,3...20 的文件。 有什么简短的方法可以让我搜索两种格式的文件(可能使用 RegEx)。
做两次,
for (int pageNum = 0; pageNum <= 20; pageNum++)
{
//templateFiles is list of files in that directory
string expectedTemplateName1 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString());
string expectedTemplateName2 = string.Format("{0}_{1}.txt", directoryName, pageNum.ToString("00"));
templateFiles.Any(file =>
(file.Equals(expectedTemplateName1, StringComparison.OrdinalIgnoreCase) ||
file.Equals(expectedTemplateName2, StringComparison.OrdinalIgnoreCase)));
}
像这样:
var re = new Regex("_[\d].");
var resultedFiles = templateFiles.Where(x => re.IsMatch(x));
在这种情况下,正则表达式可能不是最好的工具,这就是为什么我会直接使用@kennyzx 的直接方法。如果你非常想使用正则表达式,你可以使用以下内容;但请注意,这比直接字符串比较慢 >800%——而且也不一定更容易理解。
for (int pageNum = 0; pageNum <= 20; pageNum++)
{
var regex = new Regex(string.Format(@"^{0}_(?:{1}|{1:00})\.txt$", directoryName, pageNum), RegexOptions.IgnoreCase);
templateFiles.Any(file => regex.IsMatch(expectedTemplateName, StringComparison.OrdinalIgnoreCase));
}