计算文件夹C ++窗口中的目录数

时间:2014-01-13 04:09:08

标签: c++ directory subdirectory

我编写了一个Java程序,它一度计算目录中的文件夹数量。我想将这个程序翻译成C ++(我正在努力学习它)。我已经能够翻译大部分程序,但我找不到计算目录子目录的方法。我该如何做到这一点?

提前致谢

1 个答案:

答案 0 :(得分:0)

以下是使用Win32 API的实现。

SubdirCount采用目录路径字符串参数,并返回其直接子子目录的计数(作为int)。包含隐藏的子目录,但任何名为“。”的子目录。或“......”不计算在内。

FindFirstFile是一个采用TCHAR的别名,最终为FindFirstFileA或FindFirstFileW。为了保持字符串TCHAR,而不假设CString的可用性,这里的示例包括一些尴尬的代码,仅用于在函数的参数中附加“/ *”。

#include <tchar.h>
#include <windows.h>

int SubdirCount(const TCHAR* parent_path) {
    // The hideous string manipulation code below
    // prepares a TCHAR wildcard string (sub_wild)
    // matching any subdirectory immediately under 
    // parent_path by appending "\*"
    size_t len = _tcslen(parent_path);
    const size_t alloc_len = len + 3;
    TCHAR* sub_wild  = new TCHAR[alloc_len];
    _tcscpy_s(sub_wild, alloc_len, parent_path);
    if(len && sub_wild[len-1] != _T('\\')) { sub_wild[len++] = _T('\\'); }
    sub_wild[len++] = _T('*');
    sub_wild[len++] = _T('\0');

    // File enumeration starts here
    WIN32_FIND_DATA fd;
    HANDLE hfind;
    int count = 0;
    if(INVALID_HANDLE_VALUE  != (hfind = FindFirstFile(sub_wild, &fd))) {
        do {
            if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                // is_alias_dir is true if directory name is "." or ".."
                const bool is_alias_dir = fd.cFileName[0] == _T('.') && 
                    (!fd.cFileName[1] || (fd.cFileName[1] == _T('.') &&
                    !fd.cFileName[2]));

                count += !is_alias_dir;
            }
        } while(FindNextFile(hfind, &fd));
        FindClose(hfind);
    }

    delete [] sub_wild;
    return count;
}