所以这是我的代码,但我无法阻止它打印出来:。 ..并将它们视为文件。我不明白为什么。 输出是:
.
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;
}
}
答案 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_type
,stat
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”语句过滤掉这些内容。