如何从具有指定长度的可变扩展名的目录中获取所有文件?
How to I get all files from a directory with a variable extension of specified length?
我有一个巨大的目录,我需要从子目录中检索文件。
我的文件是包含各种文件的文件夹,但我只对以长度为 7 位的扩展名命名的特定专有文件感兴趣。
例如,我有包含以下文件的文件夹:
abc.txt
def.txt
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
summary.pdf
someinfo.zip
T7F4JUXA.0300600
vxy98796.csv
YJHLPLBO.0302300
YJHLPLUC.0302800
我试过以下方法:
var fileList = Directory.GetFiles(someDir, "*.???????", SearchOption.AllDirectories)
还有
string searchSting = string.Empty;
for (int j = 0; j < 9999999; j++)
{
searchSting += string.Format(", *.{0} ", j.ToString("0000000"));
}
var fileList2 = Directory.GetFiles(someDir, searchSting, SearchOption.AllDirectories);
明显是字符串太长导致的错误
我只想 return 具有指定扩展名长度的文件,在本例中为 7 位数字,以避免循环处理我必须处理的数千个数字。
我考虑过为搜索条件创建一个可变字符串,其中包含所有 99,999,999 个可能的数字,但 d
我怎样才能做到这一点?
我只是抓取目录中的文件列表,然后检查'.'之后的子字符串长度。等于 7。(* 只要您知道没有其他文件会具有该长度扩展名)
已编辑以改用路径:
Directory.GetFiles(@"C:\temp").Where(
fileName => Path.GetExtension(fileName).Length == 8
).ToList();
旧:
Directory.GetFiles(someDir).Where(
fileName => fileName.Substring(fileName.LastIndexOf('.') + 1).Length == 7
).ToList();
我认为没有一种方法可以在不循环访问目录及其子文件夹中的文件的情况下执行此操作。 GetFiles
的搜索模式不支持正则表达式,因此我们不能真正使用 [\d]{7}
之类的东西作为过滤器。我建议使用 Directory.EnumerateFiles
,然后使用 return 符合您条件的文件。
您可以使用它来枚举文件:
private static IEnumerable<string> GetProprietaryFiles(string topDirectory)
{
Func<string, bool> filter = f =>
{
string extension = Path.GetExtension(f);
// is 8 characters long including the .
// all remaining characters are digits
return extension.Length == 8 && extension.Skip(1).All(char.IsDigit);
};
// EnumerateFiles allows us to step through the files without
// loading all of the filenames into memory at once.
IEnumerable<string> matchingFiles =
Directory.EnumerateFiles(topDirectory, "*", SearchOption.AllDirectories)
.Where(filter);
// Return each file as the enumerable is iterated
foreach (var file in matchingFiles)
{
yield return file;
}
}
Path.GetExtension
包括 .
所以我们检查包括 .
在内的字符数是 8,并且所有剩余字符都是数字。
用法:
List<string> fileList = GetProprietaryFiles(someDir).ToList();
将 files
视为 Directory.GetFiles()
结果。
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
List<string> files = new List<string>()
{"abc.txt", "def.txt", "GIWFJ1XA.0201000", "GIWFJ1UC.0501000", "NOOBO0XA.0100100", "summary.pdf", "someinfo.zip", "T7F4JUXA.0300600", "vxy98796.csv", "YJHLPLBO.0302300", "YJHLPLUC.0302800"};
Regex r = new Regex("^\.\d{7}$");
foreach (string file in files.Where(o => r.IsMatch(Path.GetExtension(o))))
{
Console.WriteLine(file);
}
}
}
输出:
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
T7F4JUXA.0300600
YJHLPLBO.0302300
YJHLPLUC.0302800
编辑:我试过 (r.IsMatch)
而不是使用 o
但 dotnetfiddle 编译器给我的错误是
Compilation error (line 14, col 27): The call is ambiguous between the following methods or properties: 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,bool>)' and 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int,bool>)'
由于我现在很忙,无法调试它,如果路过的任何人提出任何修复建议,我将很高兴。但是上面的当前代码有效。
我有一个巨大的目录,我需要从子目录中检索文件。
我的文件是包含各种文件的文件夹,但我只对以长度为 7 位的扩展名命名的特定专有文件感兴趣。
例如,我有包含以下文件的文件夹:
abc.txt
def.txt
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
summary.pdf
someinfo.zip
T7F4JUXA.0300600
vxy98796.csv
YJHLPLBO.0302300
YJHLPLUC.0302800
我试过以下方法:
var fileList = Directory.GetFiles(someDir, "*.???????", SearchOption.AllDirectories)
还有
string searchSting = string.Empty;
for (int j = 0; j < 9999999; j++)
{
searchSting += string.Format(", *.{0} ", j.ToString("0000000"));
}
var fileList2 = Directory.GetFiles(someDir, searchSting, SearchOption.AllDirectories);
明显是字符串太长导致的错误
我只想 return 具有指定扩展名长度的文件,在本例中为 7 位数字,以避免循环处理我必须处理的数千个数字。
我考虑过为搜索条件创建一个可变字符串,其中包含所有 99,999,999 个可能的数字,但 d
我怎样才能做到这一点?
我只是抓取目录中的文件列表,然后检查'.'之后的子字符串长度。等于 7。(* 只要您知道没有其他文件会具有该长度扩展名)
已编辑以改用路径:
Directory.GetFiles(@"C:\temp").Where(
fileName => Path.GetExtension(fileName).Length == 8
).ToList();
旧:
Directory.GetFiles(someDir).Where(
fileName => fileName.Substring(fileName.LastIndexOf('.') + 1).Length == 7
).ToList();
我认为没有一种方法可以在不循环访问目录及其子文件夹中的文件的情况下执行此操作。 GetFiles
的搜索模式不支持正则表达式,因此我们不能真正使用 [\d]{7}
之类的东西作为过滤器。我建议使用 Directory.EnumerateFiles
,然后使用 return 符合您条件的文件。
您可以使用它来枚举文件:
private static IEnumerable<string> GetProprietaryFiles(string topDirectory)
{
Func<string, bool> filter = f =>
{
string extension = Path.GetExtension(f);
// is 8 characters long including the .
// all remaining characters are digits
return extension.Length == 8 && extension.Skip(1).All(char.IsDigit);
};
// EnumerateFiles allows us to step through the files without
// loading all of the filenames into memory at once.
IEnumerable<string> matchingFiles =
Directory.EnumerateFiles(topDirectory, "*", SearchOption.AllDirectories)
.Where(filter);
// Return each file as the enumerable is iterated
foreach (var file in matchingFiles)
{
yield return file;
}
}
Path.GetExtension
包括 .
所以我们检查包括 .
在内的字符数是 8,并且所有剩余字符都是数字。
用法:
List<string> fileList = GetProprietaryFiles(someDir).ToList();
将 files
视为 Directory.GetFiles()
结果。
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
List<string> files = new List<string>()
{"abc.txt", "def.txt", "GIWFJ1XA.0201000", "GIWFJ1UC.0501000", "NOOBO0XA.0100100", "summary.pdf", "someinfo.zip", "T7F4JUXA.0300600", "vxy98796.csv", "YJHLPLBO.0302300", "YJHLPLUC.0302800"};
Regex r = new Regex("^\.\d{7}$");
foreach (string file in files.Where(o => r.IsMatch(Path.GetExtension(o))))
{
Console.WriteLine(file);
}
}
}
输出:
GIWFJ1XA.0201000
GIWFJ1UC.0501000
NOOBO0XA.0100100
T7F4JUXA.0300600
YJHLPLBO.0302300
YJHLPLUC.0302800
编辑:我试过 (r.IsMatch)
而不是使用 o
但 dotnetfiddle 编译器给我的错误是
Compilation error (line 14, col 27): The call is ambiguous between the following methods or properties: 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,bool>)' and 'System.Linq.Enumerable.Where<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,int,bool>)'
由于我现在很忙,无法调试它,如果路过的任何人提出任何修复建议,我将很高兴。但是上面的当前代码有效。