【问题标题】:c# - How to list all files and folders on a hard drive?c# - 如何列出硬盘上的所有文件和文件夹?
【发布时间】:2012-09-02 04:46:33
【问题描述】:

我想列出我的程序可以访问的所有文件和文件夹,并将它们写入文本文件。我将如何获得清单?我需要一种在不可访问的文件夹上捕获或不抛出 UnauthorizedAccessExceptions 的方法。

【问题讨论】:

标签: c# file hard-drive


【解决方案1】:

查看Directory.GetFiles()及相关方法。

【讨论】:

  • 如果不使用此方法获得 UnauthorizedAccessException,我找不到列出所有文件的方法。
  • 您将不得不付出一些努力来解决这个问题。浏览这些方法,因为有一些用于获取权限的方法。但是,最后,你总是可以捕获异常,如果你得到那个异常,那么你的程序就知道它不能访问那个特定的位置。
  • 这是因为您没有足够的权限访问硬盘上的所有目录。您应该简单地用 try 块包装调用并管理这些错误。
  • 请考虑不使用 Directory.GetFiles() 检索机器上的所有文件。此方法返回一个数组,因此当您调用该方法时它将执行整个迭代。很难预测对客户端计算机的影响,并且很可能您将使用比您想要的更多的客户端资源。我肯定不希望在我的电脑上运行任何执行此操作的代码。如果你真的想枚举电脑上的所有文件,你应该考虑一种更温和的方法恕我直言,从 @Candie 建议的 Directory.EnumerateFiles 开始:-)
【解决方案2】:

你可以试试

var files = from file in Directory.EnumerateFiles(@"your Path", "*.*", SearchOption.AllDirectories)
            select file;

【讨论】:

    【解决方案3】:

    请尝试使用代码:

    private static IEnumerable<string> Traverse(string rootDirectory)
    {
        IEnumerable<string> files = Enumerable.Empty<string>();
        IEnumerable<string> directories = Enumerable.Empty<string>();
        try
        {
            // The test for UnauthorizedAccessException.
            var permission = new FileIOPermission(FileIOPermissionAccess.PathDiscovery, rootDirectory);
            permission.Demand();
    
            files = Directory.GetFiles(rootDirectory);
            directories = Directory.GetDirectories(rootDirectory);
        }
        catch
        {
            // Ignore folder (access denied).
            rootDirectory = null;
        }
    
        if (rootDirectory != null)
            yield return rootDirectory;
    
        foreach (var file in files)
        {
            yield return file;
        }
    
        // Recursive call for SelectMany.
        var subdirectoryItems = directories.SelectMany(Traverse);
        foreach (var result in subdirectoryItems)
        {
            yield return result;
        }
    }
    

    客户端代码:

    var paths = Traverse(@"Directory path");
    File.WriteAllLines(@"File path for the list", paths);
    

    【讨论】:

    【解决方案4】:

    使用 Serge 建议的 Traverse 和 DriveInfo 类,您可以访问电脑可用的所有文件。

    DriveInfo[] allDrives = DriveInfo.GetDrives();
    
    foreach (DriveInfo d in allDrives)
    {
       if (d.IsReady == true)
       {
          var paths = Traverse(d.Name);
          File.AppendAllLines(@"File path for the list", paths);
       }
    }
    

    【讨论】:

      【解决方案5】:

      试试

      string[] files = Directory.GetFiles(@"C:\\", "*.*", SearchOption.AllDirectories);
      

      这应该会给你一个包含硬盘上所有文件的数组。

      【讨论】:

      • 使用您提供的解决方案会抛出 Access to the path 'C:\$Recycle.Bin\S-1-5-21-1211431010-2331069801-34201645-1008' is denied.
      猜你喜欢
      • 2016-04-13
      • 2017-08-02
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多