2017-10-05 27 views
0

ディレクトリ内のフォルダの一覧を取得する必要がありますが、フォルダのみを取得する必要があります。ファイルは必要ありません。フォルダのみ。フィルターを使用して、これがフォルダーかどうかを判別しますが、機能しなくなり、すべてのファイルとフォルダーが出力されます。C++フォルダのみ検索

string root = "D:\\*"; 
cout << "Scan " << root << endl; 
std::wstring widestr = std::wstring(root.begin(), root.end()); 
const wchar_t* widecstr = widestr.c_str(); 
WIN32_FIND_DATAW wfd; 
HANDLE const hFind = FindFirstFileW(widecstr, &wfd); 

このようにして、フォルダであることを確認します。

if (INVALID_HANDLE_VALUE != hFind) 
    if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) 

問題を解決するにはどうすればよいですか?

+0

https://stackoverflow.com/questions/5043403/listing-only-folders-in-directory –

+1

の#include に、これをサポートしていない現在のDIR – Xom9ik

+1

窓に誓います。 * fSearchOp *を[FindExSearchLimitToDirectories'に設定すると、[FindFirstFileEx'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364419(v = vs.85).aspx)できます。 ](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364416(v = vs.85).aspx) - ただし、このフラグは無効です。 – RbMm

答えて

2

この関数は、指定されたベクトルにフォルダを収集します。苦労して、かつ簡単な方法:あなたがtrueに再帰を設定する場合は、これを行うには2つの方法がありhttps://stackoverflow.com/a/46511952/8666197

2

から修正など

// TODO: proper error handling. 

void GetFolders(std::vector<std::wstring>& result, const wchar_t* path, bool recursive) 
{ 
    HANDLE hFind; 
    WIN32_FIND_DATA data; 
    std::wstring folder(path); 
    folder += L"\\"; 
    std::wstring mask(folder); 
    mask += L"*.*"; 

    hFind=FindFirstFile(mask.c_str(),&data); 
    if(hFind!=INVALID_HANDLE_VALUE) 
    { 
     do 
     { 
      std::wstring name(folder); 
      name += data.cFileName; 
      if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
       // I see you don't want FILE_ATTRIBUTE_REPARSE_POINT 
       && !(data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) 
      { 
       // Skip . and .. pseudo folders. 
       if (wcscmp(data.cFileName, L".") != 0 && wcscmp(data.cFileName, L"..") != 0) 
       { 
        result.push_back(name); 
        if (recursive) 
         // TODO: It would be wise to check for cycles! 
         GetFolders(result, name.c_str(), recursive); 
       } 
      } 
     } while(FindNextFile(hFind,&data)); 
    } 
    FindClose(hFind); 
} 

フォルダ内のフォルダ内のフォルダをスキャンします。

難問は、FindFirstFileFindNextFileに基づいており、必要に応じてディレクトリを除外しています。スタックオーバーフローとインターネットの両方で、このアプローチの概要を示すbazillionサンプルがあります。

簡単な方法:標準のdirectory_iteratorクラス(サブディレクトリに再帰する必要がある場合はrecursive_directory_iterator)を使用します。解決策はのように簡単です:

for (const auto& entry : directory_iterator(path(L"abc"))) { 
    if (is_directory(entry.path())) { 
     // Do something with the entry 
     visit(entry.path()); 
    } 
} 

あなたがC++ 17で導入<filesystem>ヘッダファイルを含める必要があります。

注:最新のVisual Studio 2017(15.3.5)を使用していますが、これはまだnamespace stdにはありません。代わりにnamespace std::experimental::filesystemを参照する必要があります。


...擬似ディレクトリをフィルタリングする必要がないことを特に注意、。それらはディレクトリイテレータによって返されません。

関連する問題