我编写了一个Java程序,它一度计算目录中的文件夹数量。我想将这个程序翻译成C ++(我正在努力学习它)。我已经能够翻译大部分程序,但我找不到计算目录子目录的方法。我该如何做到这一点?
提前致谢
答案 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;
}