QDirListing Class

QDirListing クラスは、ディレクトリ・エントリのための STL スタイルのイテレータを提供します。詳細...

Header: #include <QDirListing>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Since: Qt 6.8

パブリック型

class DirEntry
(since 6.8) class const_iterator
(since 6.8) class sentinel
enum class IteratorFlag { Default, ExcludeFiles, ExcludeDirs, ExcludeSpecial, ResolveSymlinks, …, FollowDirSymlinks }
flags IteratorFlags

パブリック関数

QDirListing(const QString &path, QDirListing::IteratorFlags flags = IteratorFlag::Default)
QDirListing(const QString &path, const QStringList &nameFilters, QDirListing::IteratorFlags flags = IteratorFlag::Default)
QDirListing(QDirListing &&other)
~QDirListing()
QDirListing::const_iterator begin() const
QDirListing::const_iterator cbegin() const
QDirListing::sentinel cend() const
QDirListing::sentinel end() const
QDirListing::IteratorFlags iteratorFlags() const
QString iteratorPath() const
QStringList nameFilters() const
QDirListing &operator=(QDirListing &&other)

詳細説明

QDirListing を使用すると、ディレクトリのエントリを 1 つずつナビゲートできます。これはQDir::entryList() やQDir::entryInfoList() と似ていますが、一度にすべてのエントリをリストするのではなく、1つずつリストするため、スケーリングが向上し、大規模なディレクトリに適しています。また、ディレクトリの内容を再帰的に一覧表示したり、シンボリックリンクをたどったりすることもできる。QDir::entryList() とは異なり、QDirListing はソートをサポートしていません。

QDirListingコンストラクタは、引数としてディレクトリ・パス文字列を取ります。以下は、すべてのエントリーを再帰的に反復処理する方法です:

using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
    qDebug() << dirEntry.filePath();
    // /etc/.
    // /etc/..
    // /etc/X11
    // /etc/X11/fs
    // ...
}

以下は、名前によってフィルタリングされたすべての正規ファイルを再帰的に検索して読み込む方法です:

using F = QDirListing::IteratorFlag;
QDirListing dirList(u"/sys"_s, QStringList{u"scaling_cur_freq"_s}, F::FilesOnly | F::Recursive);
for (const auto &dirEntry : dirList) {
    QFile f(dirEntry.filePath());
    if (f.open(QIODevice::ReadOnly))
        qDebug() << f.fileName() << f.readAll().trimmed().toDouble() / 1000 << "MHz";
}

正規ファイルのみを再帰的にリストアップする方法は以下のとおりである:

using F = QDirListing::IteratorFlag;
const auto flags = F::FilesOnly | F::Recursive;
for (const auto &dirEntry : QDirListing(u"/etc"_s, flags)) {
    // ...
}

通常のファイルと通常のファイルへのシンボリック・リンクのみを再帰的にリストする方法は以下のとおりです:

using F = QDirListing::IteratorFlag;
const auto flags = F::FilesOnly | F::Recursive | F::ResolveSymlinks;
for (const auto &dirEntry : QDirListing(u"/etc"_s, flags)) {
    // ...
}

QDirListing::const_iterator モデル C++20std::input_iterator つまり、移動のみ、前進のみ、シングルパスのイテレータであり、ランダムアクセスを許可しません。これは、範囲指定ループで使用できます(または、ランダムアクセス イテレータを必要としない C++20 範囲指定アルゴリズムで使用できます)。有効なイテレータを再参照すると、 オブジェクトが返されます。(c) () センチネルは、反復処理の終了を示します。 と等しいイテレータを再参照することは、未定義の動作です。QDirListing::DirEntryend sentinel

QDirListing::DirEntry は、 の API のサブセット (例えば、fileName()、filePath()、exists()) を提供します。内部的には、 は、必要な場合、つまり他のシステム関数によって情報がまだ取得されていない場合にのみ、 オブジェクトを構築します。 を取得するには () を使用します:QFileInfo DirEntry QFileInfo QFileInfo DirEntry::fileInfo

using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
    // Faster
    if (dirEntry.fileName().endsWith(u".conf")) { /* ... */ }

    // This works, but might be potentially slower, since it has to construct a
    // QFileInfo, whereas (depending on the implementation) the fileName could
    // be known already
    if (dirEntry.fileInfo().fileName().endsWith(u".conf")) { /* ... */ }
}
using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
    // Both approaches are the same, because DirEntry will have to construct
    // a QFileInfo to get this info (for example, by calling system stat())

    if (dirEntry.size() >= 4'000 /* 4KB */) { /* ...*/ }
    if (dirEntry.fileInfo().size() >= 4'000 /* 4KB */) { /* ... */ }
}

QDir およびQDir::entryList()も参照の こと。

メンバ型ドキュメント

enum class QDirListing::IteratorFlag
flags QDirListing::IteratorFlags

この列挙クラスは、QDirListing の動作を設定するために使用できるフラグを記述します。 この列挙子からの値は、ビット単位で OR'ed することができます。

定数説明
QDirListing::IteratorFlag::Default0x000000壊れたシンボリックリンク (ターゲットが存在しない) を含む、すべてのファイル、ディレクトリ、シンボリックリンクをリストします。隠しファイルや隠しディレクトリ、特別なエントリ... はデフォルトではリストされない。
QDirListing::IteratorFlag::ExcludeFiles0x000004通常のファイルは表示しません。ResolveSymlinks と組み合わせると、通常のファイルへのシンボリックリンクも除外されます。
QDirListing::IteratorFlag::ExcludeDirs0x000008ディレクトリを表示しない。ResolveSymlinks と組み合わせると、ディレクトリへのシンボリックリンクも除外されます。
QDirListing::IteratorFlag::ExcludeSpecial0x000010特殊なシステムファイルをリストしない:
  • Unixの場合: ディレクトリ、通常のファイル、シンボリックリンク (壊れたシンボリックリンクも含む) ではないエントリ。つまり、FIFO、ソケット、キャラクタデバイス、ブロックデバイスである。
  • Windowsの場合:.lnk.
QDirListing::IteratorFlag::ResolveSymlinks0x000020シンボリックリンク自体ではなく、リンク先のタイプに基づいてシンボリックリンクをフィルタリングする。このフラグを使うと、壊れたシンボリック・リンク(ターゲットが存在しない)は除外される。このフラグは、シンボリックリンクをサポートしていないオペレーティング・システムでは無視される。
QDirListing::IteratorFlag::FilesOnlyExcludeDirs | ExcludeSpecial通常のファイルだけがリストされる。ResolveSymlinks と組み合わせると、ファイルへのシンボリックリンクもリストされます。
QDirListing::IteratorFlag::DirsOnlyExcludeFiles | ExcludeSpecialディレクトリのみがリストされる。ResolveSymlinks と組み合わせると、ディレクトリへのシンボリックリンクも表示されます。
QDirListing::IteratorFlag::IncludeHidden0x000040隠しエントリをリストする。Recursiveと組み合わせると、非表示のサブディレクトリも再検索されます。
QDirListing::IteratorFlag::IncludeDotAndDotDot0x000080. および.. の特殊エントリをリストします。
QDirListing::IteratorFlag::CaseSensitive0x000100QDirListing コンストラクタに渡された名前フィルタのファイル glob パターンは、大文字小文字を区別してマッチします (詳細はQDir::setNameFilters() を参照)。
QDirListing::IteratorFlag::Recursive0x000400すべてのサブディレクトリ内のエントリもリストします。FollowDirSymlinks と組み合わせると、ディレクトリへのシンボリックリンクも繰り返し処理されます。
QDirListing::IteratorFlag::FollowDirSymlinks0x000800Recursive と組み合わせると、ディレクトリへのシンボリックリンクも反復される。シンボリックリンクのループ(link => . や link => ...など)は自動的に検出され、無視される。

IteratorFlags型はQFlags<IteratorFlag>のtypedefである。IteratorFlag値のORの組み合わせを格納する。

メンバ関数ドキュメント

QDirListing::const_iterator QDirListing::begin() const

QDirListing::const_iterator QDirListing::cbegin() const

QDirListing::sentinel QDirListing::cend() const

QDirListing::sentinel QDirListing::end() const

(c)begin() は、ディレクトリ・エントリを反復処理するために使用できるQDirListing::const_iterator を返す。

  • これは順方向のみのシングルパスイテレータである(ディレクトリエントリを逆順に反復することはできない)。
  • コピーできない。std::move()dのみ。
  • std::input_iterator をモデル化したオブジェクトに対するポストインクリメントの返り値は、部分的に形成されたもの(その後進められたイテレータのコピー)です。このようなオブジェクトに対する有効な操作は、破棄と新しいイテレータの割り当てだけです。したがって、ポストインクリメント演算子はイテレータを進め、void を返します。
  • ランダムアクセスを許さない
  • 範囲指定ループや、ランダムアクセスのイテレータを必要としない C++20 std::ranges アルゴリズムで使用できます。
  • 有効なイテレータを再参照するとconst DirEntry &
  • (c)end() は、反復処理の終了を示すQDirListing::sentinel を返します。end() と等しい値を比較するイテレータの再参照は、未定義の動作です。

注意: 同じQDirListing オブジェクトに対して(c)begin()が呼び出されるたびに、内部状態はリセットされ、反復は新たに開始される。

(上記の制限の一部は、基礎となるシステム・ライブラリ関数の実装によって決まります)。

例えば

using ItFlag = QDirListing::IteratorFlag;
for (const auto &dirEntry : QDirListing(u"/etc"_s, ItFlag::Recursive)) {
    qDebug() << dirEntry.filePath();
    // /etc/.
    // /etc/..
    // /etc/X11
    // /etc/X11/fs
    // ...
}

以下は、名前でフィルタリングされたすべてのファイルを再帰的に検索して読み込む方法です:

using F = QDirListing::IteratorFlag;
QDirListing dirList(u"/sys"_s, QStringList{u"scaling_cur_freq"_s}, F::FilesOnly | F::Recursive);
for (const auto &dirEntry : dirList) {
    QFile f(dirEntry.filePath());
    if (f.open(QIODevice::ReadOnly))
        qDebug() << f.fileName() << f.readAll().trimmed().toDouble() / 1000 << "MHz";
}

注: 「古典的な」 STL アルゴリズムは反復子/センチネルをサポートしていないため、QDirListing には C++20 std::ranges アルゴリズムを使用するか、C++17 で範囲ベースのアルゴリズムを提供するサードパーティ製ライブラリを使用する必要があります。

QDirListing::DirEntryも参照してください

[explicit] QDirListing::QDirListing(const QString &path, QDirListing::IteratorFlags flags = IteratorFlag::Default)

path を反復処理できる QDirListing を構築します。

flags 経由でオプシ ョ ン を渡 し て、 デ ィ レ ク ト リ の反復処理を制御す る こ と がで き ます。

デフ ォル ト では、flagsIteratorFlag::Default です。

IteratorFlagsも参照してください

[explicit] QDirListing::QDirListing(const QString &path, const QStringList &nameFilters, QDirListing::IteratorFlags flags = IteratorFlag::Default)

path を反復処理できる QDirListing を構築します。

flags を介してオプションを渡すことで、ディレクトリの反復処理を制御することができます。デフォルトでは、flagsIteratorFlag::Default です。

リストされたエントリは、nameFilters のファイル・グロブ・パターンに従ってフィルタリングされます (詳細についてはQDir::setNameFilters() を参照してください)。

たとえば、以下のイテレータを使用して、オーディオ・ファイルを反復処理することができる:

QDirListing audioFileIt(u"/home/johndoe/"_s, QStringList{u"*.mp3"_s, u"*.wav"_s},
                        QDirListing::IteratorFlag::FilesOnly);

IteratorFlags およびQDir::setNameFilters()も参照

[noexcept] QDirListing::QDirListing(QDirListing &&other)

移動コンストラクタ。other をこの QDirListing に移動します。

注意: 移動元のオブジェクトother は、部分的に形成された状態に置かれ、有効な操作は破棄と新しい値の割り当てのみです。

[noexcept] QDirListing::~QDirListing()

QDirListing を破棄します。

QDirListing::IteratorFlags QDirListing::iteratorFlags() const

このQDirListing を構築するために使用されたIteratorFlags のセットを返す。

QString QDirListing::iteratorPath() const

このQDirListing の構築に使用されたディレクトリ・パスを返します。

QStringList QDirListing::nameFilters() const

このQDirListing を構築するために使用されたファイル名グロブフィルタのリストを返す。

[noexcept] QDirListing &QDirListing::operator=(QDirListing &&other)

Move-assignother をこのQDirListing に移動します。

注意: 移動元のオブジェクトother は部分的に形成された状態に置かれ、有効な操作は破棄と新しい値の割り当てのみです。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。