c# 在硬盘上查找具有某些扩展名的文件

c# finding files with some extension on hard disk

我想找到整个硬盘驱动器中的所有文件(.jpg、.png、.apk 和其他一些格式)但是这段代码不起作用..它所做的只是:例如如果在我的 'D:\' 驱动器 我有:1) 一个图像文件 'i1',2) 一个有图像文件的文件夹 'f1' 和 3) 另一个有图像文件的文件夹 'f2' 和 'f2'包含具有图像文件的文件夹 'f3'。它仅对 f1 和 f2 内的内容执行 'calcFile()',但不对 f3 和 i1 的内容执行,所有其他分区也会发生同样的情况。这里有什么问题?任何帮助表示赞赏。 我希望你明白发生了什么,因为这是我解释我的情况的最简单方法,如果需要更多信息,请告诉我。谢谢:)

public void calcDirectory(string token)
    {
var validExtensions = new[]
        {

             ".jpg", ".png", ".apk"

        };
        foreach (string s in Directory.GetLogicalDrives())
        {
            DriveInfo driveInfo = new DriveInfo(s);
            if (driveInfo.IsReady)
            {


                foreach (string d in Directory.GetDirectories(s))
                {
                    FileAttributes attrs1 = File.GetAttributes(d);
                    if (!attrs1.HasFlag(FileAttributes.ReparsePoint))
                    {
                        if (!attrs1.HasFlag(FileAttributes.System))
                        { 
                    string[] allFilesInDir = Directory.GetFiles(d);
                    for (int i = 0; i < allFilesInDir.Length; i++)
                    {
                        string file = allFilesInDir[i];
                        string extension = Path.GetExtension(file);
                        if (validExtensions.Contains(extension))
                        {
                            string p = Path.GetFullPath(file);
                            FileAttributes attrs = File.GetAttributes(p);
                            if (attrs.HasFlag(FileAttributes.ReadOnly))
                            {
                                File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
                                calcFile(file, token);
                            }
                            else
                            {
                                calcFile(file, token);
                            }
                        }
                    }

                }
            }
           }
         }
        }
    }

我在这里调用 calcDirectory()

public void start()
    {
         string token = File.ReadAllText(tokencalcalculated);
         calcDirectory(token); 
    }

您只枚举了根目录,没有枚举子目录。而不是 Directory.GetDirectories(s) 使用

foreach(string d in Directory.GetDirectories(s, "*", SearchOption.AllDirectories))

但要注意由于子目录中的链接而导致的无限循环(请参阅 SearchOption.AllDirectories 上的 MSDN)。

并且您应该了解用户访问权限。你应该在你的 GetFiles 部分周围放置一个 try...catch 以防你没有特定目录的访问权限(参见这个 question)。

我根据您的代码创建了一个函数,该函数将递归搜索目录以查找与您的模式匹配的任何内容。您必须从基本目录的循环中调用它。

public static void crawlDirectory(string token,string directory)
    {
        if (string.IsNullOrEmpty(directory)) return;
        var validExtensions = new[]
        {

             ".jpg", ".png", ".apk"

        };

        foreach (string d in Directory.GetDirectories(directory))
        {
            FileAttributes attrs1 = File.GetAttributes(d);
            if (!attrs1.HasFlag(FileAttributes.ReparsePoint) && !attrs1.HasFlag(FileAttributes.System))
            {
                string[] allFilesInDir = Directory.GetFiles(d);
                for (int i = 0; i < allFilesInDir.Length; i++)
                {
                    string file = allFilesInDir[i];
                    string extension = Path.GetExtension(file);
                    if (validExtensions.Contains(extension))
                    {
                        string p = Path.GetFullPath(file);
                        FileAttributes attrs = File.GetAttributes(p);
                        if (attrs.HasFlag(FileAttributes.ReadOnly))
                        {
                            File.SetAttributes(p, attrs & ~FileAttributes.ReadOnly);
                            calcFile(file, token);
                        }
                        else
                        {
                            calcFile(file, token);
                        }
                    }
                }
            }

            crawlDirectory(d, token);
        }
    }