在一个目录中计算特定扩展名文件的数量 - C++?

3

在C++中,是否有可能统计目录中具有特定扩展名的文件数量?

我正在编写一个程序,希望能够像下面这样实现(伪代码):

if (file_extension == ".foo")
    num_files++;
for (int i = 0; i < num_files; i++)
    // do something

显然,这个程序要复杂得多,但这应该能让你大概了解我要做什么。 如果不可能,请告诉我。 谢谢!
3个回答

6

C或C++的标准本身没有关于目录处理的内容,但是任何值得称道的操作系统都将具有这样的功能,例如findfirst/findnext函数或readdir

您可以通过简单地循环这些函数来完成此操作,检查返回的字符串末尾是否有所需的扩展名。

类似于:

char *fspec = findfirst("/tmp");
while (fspec != NULL) {
    int len = strlen (fspec);
    if (len >= 4) {
        if (strcmp (".foo", fspec + len - 4) == 0) {
            printf ("%s\n", fspec);
        }
    }
    fspec = findnext();
}

如先前所述,用于遍历目录的实际函数是与操作系统相关的。

对于UNIX系统,几乎肯定会使用 opendirreaddirclosedir 函数。以下代码是一个很好的起点:

#include <dirent.h>

int len;
struct dirent *pDirent;
DIR *pDir;

pDir = opendir("/tmp");
if (pDir != NULL) {
    while ((pDirent = readdir(pDir)) != NULL) {
        len = strlen (pDirent->d_name);
        if (len >= 4) {
            if (strcmp (".foo", &(pDirent->d_name[len - 4])) == 0) {
                printf ("%s\n", pDirent->d_name);
            }
        }
    }
    closedir (pDir);
}

在上述两种情况下,使用for(;;)循环不是更简洁吗? - Martin York
我认为这是品味或风格问题,@Martin。对于简单的事情(大多数是“for i = 1 to 10”这种类型),我倾向于使用for循环,而对于更复杂的循环,则使用while。但无论哪种情况,都与手头的问题不太相关。 - paxdiablo

6
这种功能是特定于操作系统的,因此没有标准的、可移植的方法来实现它。
然而,使用Boost的文件系统库,您可以以可移植的方式执行此操作,以及更多与文件系统相关的操作。

1

首先,你要为哪个操作系统编写代码?

  • 如果是 Windows 系统,可以在 MSDN 上查找 FindFirstFileFindNextFile
  • 如果你正在寻找 POSIX 系统的代码,请阅读 man 中的 opendirreaddirreaddir_r
  • 对于跨平台,我建议使用 Boost.Filesystem 库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接