1

因此,我制作了一个程序来备份具有特定扩展名的某些特定文件,因此,我输入带有扩展名的列表或数组我想进行备份

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:\"

4

5 回答 5

1

将重载GetFile与 option 一起使用SearchOption.AllDirectories,因此您无需递归调用,也可以将 LINQ 与 一起使用SelectMany

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));
于 2013-02-18T16:48:32.013 回答
1

为了简单地扩展你所拥有的,你将需要另一个循环,一个GetFiles基于当前迭代扩展和调用的循环,尽管“制作一个最快速的系统”在这个级别上是非常雄心勃勃的。反正,...

foreach (string d in Directory.GetDirectories(sDir)) {
  foreach (string e in extensions) {
    foreach (string f in Directory.GetFiles(d, e)) {

    }
  }
}
于 2013-02-18T16:39:29.817 回答
0

调用 GetFiles(string Directory) 并将结果返回到单个列表中,然后对其进行解析可能会稍微提高性能。以下代码段应该可以满足您的需要...

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)));
}
于 2013-02-18T16:55:04.903 回答
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);
        }
    }
于 2013-02-18T16:46:12.943 回答
0

您可以提供多个搜索条件,但用分号分隔值

*.vb;*.txt

所以你可以简单地使用列表生成搜索字符串

var search = string.Join(";", extensions.ToArray());
...
foreach (string f in Directory.GetFiles(d, search))
{
    ...
}
于 2013-02-18T16:49:41.403 回答