2014-01-13 5 views
0

Я написал программу Java, которая в какой-то момент подсчитывает количество папок в каталоге. Я хотел бы перевести эту программу на C++ (я пытаюсь ее изучить). Я смог перевести большую часть программы, но мне не удалось найти способ подсчета подкаталогов каталога. Как бы я это сделал?подсчитывает количество каталогов в папке C++ windows

Заранее спасибо

+0

Какой код у вас есть до получения каталога? Что вы на Java и что вы пробовали на C++? – Joe

+0

Вы должны искать такие функции, как 'opendir' и' readdir'. Если вы хотите найти информацию о записи в каталоге (например, является ли это подкаталогом), вам нужно будет использовать 'fstat'. – unxnut

+0

'FindFirstFile' и' FindNextFile' или (желательно) [Boost Fileystem] (http://www.boost.org/doc/libs/release/libs/filesystem/doc/index.htm), который имеет итератор каталогов, которые вы можете использовать со стандартными алгоритмами. –

ответ

0

Вот реализация с использованием API Win32.

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; 
} 
Смежные вопросы