C# - 如何列出硬盘上的所有文件和文件夹?

4

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


可能是重复的问题:如何在C#中递归列出目录中的所有文件? - Adam Strobel
5个回答

10

请尝试使用以下代码:

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);

@aiodintsov,当然可以!这是因为Windows UAC的缘故。您可以为您的应用程序添加清单(http://www.codeproject.com/Articles/17968/Making-Your-Application-UAC-Aware),以使用提升权限。 - Sergey Vyacheslavovich Brunov

2

尝试

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

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

2
使用您提供的解决方案会抛出“拒绝访问路径'C:\ $ Recycle.Bin \ S-1-5-21-1211431010-2331069801-34201645-1008'”的错误。 - Hooman

0

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


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

0

你可以尝试使用

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

0
利用Serge建议的遍历方法和DriveInfo类,您可以访问PC上所有可用的文件。
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);
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接