如何使用'Directory.getFiles'获取磁盘上具有特定扩展名的所有文件并将它们保存在列表中



我正在做一个控制台项目,其目标是在整个磁盘中搜索扩展名为".config"的所有文件

我尝试过类似的东西:

foreach (string file in Directory.GetFiles("C:\", "*.config", SearchOption.AllDirectories))
  {
   Console.WriteLine(file);
   Console.ReadLine();
}

但给了我一个错误"拒绝访问路径(...

在互联网上,我找到了这个代码:

Stack<string> pending = new Stack<string>();
        pending.Push("C:\");
        while (pending.Count != 0)
        {
            var path = pending.Pop();
            string[] next = null;
            try
            {
                next = Directory.GetFiles(path, "*.config");
            }
            catch { }
            if (next != null && next.Length != 0)
                foreach (var file in next)
                {
                    Console.WriteLine(file);
                    Console.ReadLine();
                }
            try
            {
                next = Directory.GetDirectories(path);
                foreach (var subdir in next) pending.Push(subdir);
            }
            catch { }
        }

但它只是显示始终在"输入"中单击的路径,我想将这些文件/路径保存在列表中。

有人可以帮忙吗?

您可以做两件事来改进该代码:

  1. 使用 Directory.EnumerateFiles()Directory.EnumerateDirectories() 以避免复制每个目录中所有文件的名称。
  2. 使方法的返回类型IEnumerable<string>,使其更易于使用。

我们还需要非常小心因尝试访问受保护的文件和目录而导致的异常。下面的代码也很复杂,因为不允许你从try/catch块内部yield return,所以我们必须稍微重新排列代码。

(另请注意,我们必须处理从.GetEnumerator()返回的枚举器;通常这是在使用foreach时自动完成的,但在这种情况下我们不能 - 因为必须避免在try/catch中执行yield return - 所以我们必须使用using来处理它。

下面是对原始代码的修改:

public static IEnumerable<string> GetFiles(string root, string spec)
{
    var pending = new Stack<string>(new []{root});
    while (pending.Count > 0)
    {
        var path = pending.Pop();
        IEnumerator<string> fileIterator = null;
        try
        {
            fileIterator = Directory.EnumerateFiles(path, spec).GetEnumerator();
        }
        catch {}
        if (fileIterator != null)
        {
            using (fileIterator)
            {
                while (true)
                {
                    try
                    {
                        if (!fileIterator.MoveNext()) // Throws if file is not accessible.
                            break;
                    }
                    catch { break; }
                    yield return fileIterator.Current;
                }
            }
        }
        IEnumerator<string> dirIterator = null;
        try
        {
            dirIterator = Directory.EnumerateDirectories(path).GetEnumerator();
        }
        catch {}
        if (dirIterator != null)
        {
            using (dirIterator)
            {
                while (true)
                {
                    try
                    {
                        if (!dirIterator.MoveNext()) // Throws if directory is not accessible.
                            break;
                    }
                    catch { break; }
                    pending.Push(dirIterator.Current);
                }
            }
        }
    }
}

例如,下面介绍如何使用控制台应用列出"C:\"驱动器上所有可访问的".txt"文件:

static void Main()
{
    foreach (var file in GetFiles("C:\", "*.txt"))
    {
        Console.WriteLine(file);
    }
}

替换行

Console.WriteLine(file);
Console.ReadLine();

使用将它们存储在列表中的方法。
例如

foundFiles.Add(file);

然后,当该方法完成后,您可以从此列表中读取所有找到的文件路径。

注意:
这不会生成系统上与过滤器匹配的所有文件。
只有您的应用程序有权访问其各自目录的文件才会以这种方式找到。
例如,其他用户的Windows目录和用户目录通常受到保护。(假设你在Windows上运行(

请记住,某些文件可能独立于其目录受到保护。
因此,在尝试读取它们时,还要考虑读取可能会失败的事实。
只需通过尝试捕获来包含阅读。

关于错误"拒绝访问路径(...(",有时您必须以管理员身份运行Visual Studio才能访问C:\驱动器中的某些文件夹。

相关内容

  • 没有找到相关文章

最新更新