C ++文件夹打开和文件计数

时间:2015-10-29 00:49:28

标签: c++ file count directory

所以这是我的代码,但我无法阻止它打印出来:。 ..并将它们视为文件。我不明白为什么。 输出是:

.
1files.
..
2files.
course3.txt
3files.
course2.txt
4files.
course1.txt
5files.

但是只有3个文件......应该说3个文件而不是它。 ..而且我不知道它的含义。

int folderO(){
    DIR *dir;
    struct dirent *ent;
    int nFiles=0;
    if ((dir = opendir ("sampleFolder")) != NULL) {
      /* print all the files and directories within directory */
      while ((ent = readdir (dir)) != NULL) {
        std::cout << ent->d_name << std::endl;
        nFiles++;
        std::cout << nFiles << "files." << std::endl;
      }
      closedir (dir);
    } 
    else {
      /* could not open directory */
      perror ("");
      return EXIT_FAILURE;
    }
}

3 个答案:

答案 0 :(得分:1)

。和..分别是元目录,当前目录和父目录。

您发现子目录与文件一起打印。符号链接和其他“怪异的”#34; Unix-y的东西。如果你不想打印它们,可以用几种方法来过滤掉它们:

如果您的系统支持d_type结构中的dirent,请在打印前检查d_type == DT_FILE。 (GNU page on dirent listing possible d_types

if (ent->d_type == DT_FILE)
{
    std::cout << ent->d_name << std::endl;
    nFiles++;
    std::cout << nFiles << "files." << std::endl;
}

如果不支持d_typestat the file name and check that it is a file st_mode == S_ISREG

struct stat statresult;
if (stat(ent->d_name, &statresult) == 0)
{
    if (statresult.st_mode == S_ISREG)
    {
        std::cout << ent->d_name << std::endl;
        nFiles++;
        std::cout << nFiles << "files." << std::endl;
    }
}

当然还有基于简单strcmp的if语句,但这会列出所有其他子目录。

垃圾。抱歉。 C ++。最后一行应该是&#34;当然还有基于简单std::string operator==的if语句,但是这将列出所有其他子目录。&#34;

答案 1 :(得分:0)

.是当前目录inode(技术上是硬链接),..是父目录。

这些是用于导航的。他们是目录,如果它们是目录,你可以忽略它们吗?

答案 2 :(得分:0)

Google搜索会发现这些是具有以下含义的特殊文件夹名称:

  • .当前目录
  • ..父目录

任何有关迭代目录的教程都会向您展示如何使用简单的“if”语句过滤掉这些内容。