【问题标题】:c# finding files with some extension on hard diskc#在硬盘上查找带有某些扩展名的文件
【发布时间】:2016-03-15 02:43:45
【问题描述】:

我想查找整个硬盘驱动器中的所有文件(.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); 
    }

【问题讨论】:

标签: c# file find hard-drive drive


【解决方案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);
        }
    }

【讨论】:

  • 感谢回复,但在 calcDirectory(d) 上显示错误;它说“非静态字段、方法或属性需要对象引用”
  • 尝试将其从静态转换为“非”静态。看看这是否有效。您还必须插入它来代替当前目录循环。
  • 在研究了您的代码后,我发现最后一次调用 calcDirectory(d) 不合适,因为 'd' 将是路径并且我的 calcDirectory() 接受 'token'(password) 作为参数
  • 天哪,你是 100% 正确的。那是我的一个错误。这就是递归发生的地方。在我发布并搞砸之前,我做了一个快速的重构。该调用应该是 crawlDirectory(d, token)。我在上面做了适当的改变。
  • 它解决了我的部分问题,如果您在开始时查看我的问题,我提到它直到 'i1'(直接位于 D:\\ eg:D:\ \image.jpg),但它仍然没有..但感谢您的帮助,它解决了我的大部分问题..
【解决方案2】:

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

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

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

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

【讨论】:

  • 正如您预测的那样,它给出了错误,说访问 C\document 和设置被拒绝,这是一个 ReparsePoint 我猜所以我怎么能忽略这些文件,我什至包括 try..catch 我也想排除 Recycler 和 System Volume Information 等文件
  • 请查看链接的问题。你现在是那个副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
相关资源
最近更新 更多