c#查找硬盘上有一些扩展名的文件

时间:2015-12-09 17:38:08

标签: c# file find hard-drive drive

我想找到整个硬盘中的所有文件(.jpg,.png,.apk和其他几种格式),但这段代码无法正常工作......它的确如此:例如,如果在我的' D中:\'我有:1)图像文件' i1',2)文件夹' f1'它有图像文件和3)另一个文件夹' f2'它有图像文件和' f2'包含文件夹' f3'它有图像文件。它只执行' calcFile()'在f1和f2内的内容而不是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); 
    }

2 个答案:

答案 0 :(得分:1)

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

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

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

您应该了解用户访问权限。如果您没有特定目录的访问权限,则应在try...catch部分周围添加GetFiles(请参阅此question)。

答案 1 :(得分:1)

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

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