只读目录中包含子文件夹的.txt文件

时间:2011-04-26 20:05:24

标签: c++

我正在尝试从目录中只读取.txt文件。 我没有使用数组。 我正在使用opendir()打开我的目录。 d->d_name列出了我的所有文件以及子文件夹。 我想只读.txt而不是子文件夹。

请帮帮我。 感谢

6 个答案:

答案 0 :(得分:1)

您不能使用FindFirstFileFindNextFile吗?

答案 1 :(得分:1)

嗯,比如:

  • 调用opendir()打开目录
  • 在循环中,调用readdir来阅读每个条目
  • 对于每个条目,检查名称以查看最后4个字符是否为“.txt”
  • 如果是,请做点什么
  • 最后,调用closedir关闭目录

答案 2 :(得分:1)

您可以使用stat()功能来确定struct dirent所代表的文件类型。

struct stat sb;
int rc = stat(filename, &sb);
// error handling if stat failed
if (S_ISREG(sb.st_mode)) {
 // it's a regular file, process it
} else {
 // it's not a regular file, skip it
}

阅读手册页了解详情。还要注意d_name中的文件名不包含目录部分。如果您所在的目录与opendir不同,则需要预先添加目录名称(如果需要,还需要目录分隔符)。

有关C ++的替代方案,请参阅boost::filesystem

答案 3 :(得分:0)

您可以尝试将文件名放入一个简单的结构(例如字符串数组或向量),然后将对该结构的引用传递给修剪不使用.txt扩展名的名称的函数

在函数中,查看每个文件名(for循环会很方便),并使用String库中的find函数查看最后四个字符是否== .txt。您可以重置开始搜索字符串的位置为string_name.length - 4,这样您只需比较最后几个字符。

Cplusplus.com是字符串库之类的很好的参考:http://www.cplusplus.com/reference/string/string/find/

答案 4 :(得分:0)

假设您使用的是Linux / Posix系统,则可以使用 scandir(...)。您可以在手册页上找到详细信息,但简而言之,您必须提供一个过滤器函数,该函数将 dirent 指针作为参数,如果要包含该条目,则返回非零值(在你的情况,你会检查以.txt结尾的名字,以及可能是dirent结构中的文件类型。

答案 5 :(得分:0)

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    DIR *dir;

    struct dirent *entry;

    int pos;

    if (argc < 2)
    {
        printf("Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    if ((dir = opendir(argv[1])) == NULL)
    {
        perror("opendir");
        return 1;
    }

    while ((entry = readdir(dir)) != NULL)
    {
        if (entry->d_type != DT_REG)
            continue;

        pos = strlen(entry->d_name) - 4;

        if (! strcmp(&entry->d_name[pos], ".txt"))
        {
            printf("%s\n", entry->d_name);
        }
    }

    if (closedir(dir) == -1)
    {
        perror("closedir");
        return 1;
    }

    return 0;
}