所以,我制作了一个程序,用特定的扩展名来备份某个特定的文件,所以,我输入了List或数组,其中包含了我想要进行备份的扩展名
List<string> extensions = new List<string>();
extensions.Add("*.pdf");
extensions.Add("*.txt");
extensions.Add("*.inf");
extensions.Add("*.doc");
extensions.Add("*.cpp");
extensions.Add("*.cs");
extensions.Add("*.vb");
好的,但是,我如何制作搜索系统,在文件夹中查找带有该扩展名的文件..
搜索系统很简单:
public void DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, "*.pdf"))
{
Console.WriteLine(f);
}
DirSearch(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
好的,但是,我怎样才能使这个搜索列表中的所有扩展名(制作一个最快的系统),并且,程序无法进入windows文件夹...,如果我设置sDir =“C :\“
答案 0 :(得分:1)
简单地扩展你所拥有的东西你需要另一个循环,一个迭代扩展并根据当前调用GetFiles
,但是“制作一个最快速的系统”在这个级别上是非常雄心勃勃的。无论如何,...
foreach (string d in Directory.GetDirectories(sDir)) {
foreach (string e in extensions) {
foreach (string f in Directory.GetFiles(d, e)) {
}
}
}
答案 1 :(得分:1)
对选项SearchOption.AllDirectories
使用重载GetFile
,因此您不需要递归调用,也可以使用带SelectMany
的LINQ:
var result = extensions.SelectMany(e =>
Directory.GetFiles(sDir, e, SearchOption.AllDirectories));
更新:要忽略受保护的文件夹,您可以使用try catch
跳过例外:
private string[] GetFiles(string directory, string pattern)
{
try
{
return Directory.GetFiles(directory, pattern,
SearchOption.AllDirectories);
}
catch (Exception)
{
return new string[0];
}
}
所以:
var result = extensions.SelectMany(e => GetFiles(sDir, e));
答案 2 :(得分:0)
您不需要额外的循环或递归,只需使用重载的Directory.GetFiles
,它将以递归方式获取所有文件名
public void DirSearch(string sDir)
{
try
{
foreach (string item in extensions)
{
string[] files = Directory.GetFiles(sDir, item, SearchOption.AllDirectories);
foreach (var file in files)
{
Console.WriteLine(file);
}
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
答案 3 :(得分:0)
您可以提供多个搜索条件,但使用分号
分隔值*.vb;*.txt
因此,您只需使用列表
生成搜索字符串即可var search = string.Join(";", extensions.ToArray());
...
foreach (string f in Directory.GetFiles(d, search))
{
...
}
答案 4 :(得分:0)
调用GetFiles(字符串目录)并将结果返回到单个列表中然后解析它可能稍微高效一些。以下代码片段可以满足您的需求......
var extensions = new List<string> { ".pdf", ".txt", ".inf", ".doc", ".cpp", ".cs", ".vb" };
var files = Directory.GetFiles(topLevelFolder, "*.*", SearchOption.AllDirectories);
var matching = new List<string>();
foreach (var ext in extensions)
{
matching.AddRange(files.Where(f => f.EndsWith(ext)));
}