【问题标题】:C++ Recursive File/Directory scanning using Cygwin使用 Cygwin 的 C++ 递归文件/目录扫描
【发布时间】:2009-05-22 16:30:57
【问题描述】:

我正在寻找一个可移植的文件系统扫描器,能够递归地列出给定目录路径上的所有文件。

为此,我尝试将 cygwin 用于我的编译器,使用 dirent.h 并使用模板:

#include <dirent.h> 
#include <stdio.h> 

int main(void)
{
  DIR           *d;
  struct dirent *dir;
  d = opendir(".");
  if (d)
  {
    while ((dir = readdir(d)) != NULL)
    {
      // Stuff
    }    
    closedir(d);
  }    
  return(0);
}

但还需要添加递归目录搜索。为此,我的解决方案是尝试在下一个文件上 opendir(),并判断错误代码以确定它是否作为目录成功打开(然后我将对其进行递归),或者它是否返回为 'not一个目录',然后它会被列为一个文件。

我承认感觉很笨拙,但我一直找不到更好的方法来保留一些可移植性(不是 win32),即使经过数小时的搜索。

所以我的简化解决方案(为了简单起见有些伪)看起来像这样:

整数扫描(字符串 startdir) { 目录 *d; 结构 dirent *dir; d = opendir(startdir.cstr()); 如果 (d) { 而 ((dir = readdir(d)) != NULL) { if( 不是 '.' 而不是 '..') { 如果(temp = opendir(startdir + d)== NULL) { //文件或错误 }别的{ //作为目录打开成功,所以递归 扫描(开始目录 + d->d_name + “\\”); } } } 关闭(d); } 返回(0); }

这只是为了保持简单而重写了一半的伪代码,但它似乎有效(尽管我非常愿意接受有关更好方法的建议)。

然而,我遇到的主要问题是一个特定的链接文件“c:\cygwin\dev\fd”,它似乎作为一个目录打开,并以递归方式一遍又一遍地无限地打开。

“fd”文件为 4KB,106 字节,无扩展名,是一个快捷方式,不指向 Windows 中的任何位置。

这个错误似乎表明这个 kludgey 方法有问题,或者我正在编译的 cygwin 实现中存在问题。

作为一个简短的例子:

错误读取:c:\cygwin\dev\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd \5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5 \fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd \5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5 \fd\5\fd\0 没有那个文件或目录

排除该目录,搜索似乎运行良好。但是我不同意将排除项硬编码到扫描仪中。

如果有人对此问题有任何想法、建议、解决方案或替代方法,我们将不胜感激。

谢谢。

【问题讨论】:

    标签: c++ recursion filesystems cygwin


    【解决方案1】:

    如果您可以使用 boost,请考虑使用 boost::filesystem。这些教程包括一个简单的 ls 程序,您可以轻松地将其扩展为递归工作。该库还包括查询文件类型的方法,这可能可以解决您的特定问题。

    【讨论】:

    • 虽然这可能是一个好主意,但我对使用任何其他需要进一步讨论和上级批准的库(甚至是免费库)犹豫不决。我会进一步研究它(正如我在其他地方也提到过的那样),并可能进行宣传。感谢您的反馈
    【解决方案2】:

    罪魁祸首似乎是fd文件链接到/proc/

    我不保证它是真实的,但我的印象是这使扫描器能够递归地循环遍历它自己的目录结构。

    我使用 readlink() 解决这个问题的努力起初很有希望,但我发现随着扫描的深入,它变得不可靠,并且仍然可能发生错误。

    我现在正在研究实现此功能的其他方法(即 boost::filesystem)。

    【讨论】:

      【解决方案3】:

      这是一个虚拟文件系统,可能带有符号链接。 Cygwin 支持符号链接,您可能需要将其考虑在内。

      【讨论】:

        【解决方案4】:

        您确实意识到 cygwin 拥有所有 UNIX 工具。

        查找非常有用。

        【讨论】:

          【解决方案5】:

          cygwin 库同时具有 ftw() 和 fts(),使用其中之一。

          【讨论】:

            【解决方案6】:

            在您的示例中,您尝试再次使用 opendir() 来确定某个内容是文件还是目录。您可以使用“sys/stat.h”中的 stat() 更直接地执行此操作。这也应该在 cygwin 中可用。您可以使用宏 S_ISREG() 和 S_ISDIR() 来检查常规文件或目录。大概是这样的:

                struct stat *buf = new struct stat;
                if(!stat(d->d_name, buf))
                {
                    if(S_ISREG(buf->st_mode))
                    {
                        std::cout << "    File: " << entry->d_name << "\n";
                    }
                    if(S_ISDIR(buf->st_mode) &&  
            

            请查看我提供给其他questionanswer

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-06-25
              • 2012-11-30
              • 1970-01-01
              • 1970-01-01
              • 2010-11-02
              • 2014-03-26
              • 2014-10-01
              • 2011-05-05
              相关资源
              最近更新 更多