2016-10-27 1 views
0

Предположим, у меня есть папка. В этой папке существуют некоторые файлы и папки, я хочу получить доступ к папкам не к файлам. Как мне это сделать. Я знаю, что существует эта функция в C++: FindFirstFileA и я пишу следующий код, но эта работа для файлов.Как получить доступ к папкам не к файлам в определенной папке в C++?

WIN32_FIND_DATAA ffd; 
string s = "E:\\OpenCV\\SABT\\Old"; 

HANDLE hFind = FindFirstFileA(s.c_str(), &ffd); 

if (INVALID_HANDLE_VALUE == hFind) 
{ 
    printf("no file found"); 
    return -1; 
} 

if (ffd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) 
{ 

    do 
    { 
     std::string fn = path + ffd.cFileName; 
     printf("file %s\n", fn.c_str()); 

    } while (FindNextFileA(hFind, &ffd) != 0); 
} 
+1

'FindFirstFileA' является функцией API обертки для Windows, а не C++ стандартной библиотеки функций. Если вы решите использовать Windows API, вы можете избежать множества проблем, используя базовые API-интерфейсы широкого класса, основанные на 'wchar_t', то есть' FindFirstFileW' (или просто определите 'UNICODE' и напишите' FindFirstFile'). Стандартная библиотека библиотеки C++ * будет * почти оптовой заменой файловой системы Boost. Он уже доступен с Visual C++, который выглядит так, как будто вы используете. В противном случае, если он недоступен в вашем компиляторе, просто установите последнюю версию Boost. –

+0

findfirstfile и findnextfile будут работать как для файлов, так и для папок. – Stuart

+0

@ Пользователи и hth. Альф, ты прав. эта функция - Win API. –

ответ

1

Вы проверяете ffd.dwFileAttributes неправильный путь. Это битмаска, и каталог может иметь сразу несколько атрибутов, поэтому вам нужно использовать побитовый оператор И & вместо оператора равенства ==.

Не забудьте также проверить/игнорировать записи "." и ".." при перечислении подпапок. И позвоните FindClose(), когда вы закончите перечисление.

Попробуйте что-то больше, как это вместо:

WIN32_FIND_DATAA ffd; 
string path = "E:\\OpenCV\\SABT\\Old\\"; 

HANDLE hFind = FindFirstFileA((path + "*.*").c_str(), &ffd); 

if (INVALID_HANDLE_VALUE == hFind) 
{ 
    if (GetLastError() == ERROR_FILE_NOT_FOUND) 
     printf("no folders found\n"); 
    else 
     printf("error searching for folders\n"); 
    return -1; 
} 

do 
{ 
    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    { 
     if ((lstrcmpA(ffd.cFileName, ".") != 0) && 
      (lstrcmpA(ffd.cFileName, "..") != 0)) 
     { 
      std::string fn = path + ffd.cFileName; 
      printf("%s\n", fn.c_str()); 
     } 
    } 
} 
while (FindNextFileA(hFind, &ffd)); 

if (GetLastError() != ERROR_NO_MORE_FILES) 
{ 
    printf("error searching for folders\n"); 
} 

FindClose(hFind); 
+0

Отлично, теперь он работает. –

0

Вы хотите:

WIN32_FIND_DATAA ffd; 
string s = "E:\\OpenCV\\SABT\\Old"; 

HANDLE hFind = FindFirstFileA(s.c_str(), &ffd); 

if (INVALID_HANDLE_VALUE == hFind) 
{ 
    printf("no file found"); 
    return -1; 
} 

do 
{ 
    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    { 
    std::string fn = path + ffd.cFileName; 
    printf("file %s\n", fn.c_str()); 
    } 
} while (FindNextFileA(hFind, &ffd) != 0); 
+0

спасибо, ваш ответ тоже прав. –

Смежные вопросы