2016-12-23 2 views
12

2017年に予想される新しい標準にはstd::filesystemが追加されています。それを使用して、ディレクトリ内のファイル(サブディレクトリを含む)の数をどのように数えることができますか?標準でディレクトリ内のファイル数を数える方法は?

私たちが行うことができます知っている:

std::size_t number_of_files_in_directory(std::filesystem::path path) 
{ 
    std::size_t number_of_files = 0u; 
    for (auto const & file : std::filesystem::directory_iterator(path)) 
    { 
     ++number_of_files; 
    } 
    return number_of_files; 
} 

しかし、それはやり過ぎと思われます。よりシンプルで高速な方法が存在しますか?

答えて

18

私は簡単にディレクトリ内のファイルの量を取得する方法が存在することを考えていませんが、あなたができます代わりに手書きのループのstd::distanceを使用してコードを簡素化:

std::size_t number_of_files_in_directory(std::filesystem::path path) 
{ 
    using std::filesystem::directory_iterator; 
    return std::distance(directory_iterator(path), directory_iterator{}); 
} 

あなたが唯一の実際のファイルの数を取得したり、代わりにcount_ifを使用して、任意の他のフィルタを適用することができます。

std::size_t number_of_files_in_directory(std::filesystem::path path) 
{ 
    using std::filesystem::directory_iterator; 
    using fp = bool (*)(const std::filesystem::path&); 
    return std::count_if(directory_iterator(path), directory_iterator{}, (fp)std::filesystem::is_regular_file); 
} 
+0

[directory_iterator']の 'difference_type'のように見えますhttp://en.cppreference.com/w/cpp/experimental/fs/directory_iterator)は 'std :: ptrdiff_t'ですので、' size_t'が必要な場合は最初のキャストをキャストする必要があります。 – clcto

+2

これらを短縮することができます: 'std :: distance(directory_iterator(path)、{});'と 'return std :: count_if(directory_iterator(path)、{}、std :: filesystem :: is_regular_file);' – ildjarn

+2

'count_if'バージョンをテストしましたか?それはコンパイルされません。 'is_regular_file'には3つのオーバーロードがあります。 –

9
std::size_t number_of_files_in_directory(std::filesystem::path path) 
{ 
    return (std::size_t)std::distance(std::filesystem::directory_iterator{path}, std::filesystem::directory_iterator{}); 
} 

ディレクトリにあるファイルの数を調べる機能はありません。ディレクトリにあるファイルの数を調べる機能はありません。 OSはreaddir()ftw()FindFirstFileW()のような機能しか持っていないので、標準はより良い方法を提供できません。

(あなたがするかどうかを決定することを可能にする、またはどのように深いに、サブディレクトリに再帰的にプラス側)

+1

@Boiethiosはいそうです:http://en.cppreference.com/w/cpp/experimental/fs/directory_iteratorまた、その範囲がどのように動作するかにもよるので、もしあなたのコードがうまくいくなら、それは必要です。 – clcto

+0

'std :: ptrdiff_t'は' std :: size_t'に暗黙的に変換可能であることが保証されていますか? – clcto

+1

@clcto Hum、 'std :: ptrdiff_t'が署名されています。負の数のファイルはほとんど意味がありません。 – Boiethios

関連する問題