QDirIterator를 QDirListing으로 이식
Qt 6.8에서는 QDirIterator 을 대체할 더 효율적인 함수인 QDirListing 이 추가되었습니다( 은 당분간 계속 사용할 수 있습니다). 이 페이지에서는 QDirIterator 를 QDirListing 로 포팅할 때 유의해야 할 몇 가지 사항을 설명합니다.
QDirIterator 을 사용하면 QDirIterator::IteratorFlags 과 QDir::Filters 라는 두 개의 별도 열거형에 포함된 플래그를 통해 나열될 항목을 제어할 수 있는 반면, QDirListing 은 이 작업을 처리하기 위한 하나의 플래그 세트를 제공합니다.
QDirIterator::IteratorFlags 을 QDirListing::IteratorFlags 으로 이식하는 것은 간단합니다:
- QDirListing::IteratorFlag::Default 는 다음과 동일합니다. QDirIterator::NoIteratorFlags
- QDirListing::IteratorFlag::FollowDirSymlinks 다음과 동일하며 QDirIterator::FollowSymlinks
- QDirListing::IteratorFlag::Recursive 다음과 동일합니다 QDirIterator::Subdirectories
QDir::Filters 를 QDirListing::IteratorFlags 로 이식하는 작업은, 사용하는 QDir::Filters 의 비트별 OR 연산 조합에 따라 더 복잡해질 수 있습니다.
- 기본적으로 QDirListing 는 디렉터리, 일반 파일, 심볼릭 링크 및 특수(기타) 파일 시스템 항목을 나열합니다. 다양한 QDirListing::IteratorFlag::Exclude* 플래그를 사용하여 유형에 따라 항목을 제외할 수 있습니다.
- QDir의 기본 필터는 QDir::AllEntries 이며, 이는 다음과 동일합니다:
using F = QDirListing::IteratorFlag; QDirListing::IteratorFlags(F::ExcludeOther|F::ResolveSymlinks|F::IncludeDotAndDotDot); - 기본적으로 ` QDirListing `는 (Windows) 드라이브를 나열하므로, ` QDir::Drives`에 해당하는 필터는 없습니다.
- QDir::Readable, QDir::Writable, QDir::Executable 및 QDir::AllDirs: QDirListing 에는 이에 상응하는 플래그가 없습니다. 이 기능이 필요한 경우, range-for 루프를 사용하여 항목을 순회하고 필요에 따라 필터링하십시오.
QDirIterator dit(dirPath, QDir::AllEntries | QDir::Readable | QDir::Executable | QDir::NoDotAndDotDot); while (dit.hasNext()) { const QFileInfo fi = dit.nextFileInfo(); fileNames.append(fi.fileName()); ... } using F = QDirListing::IteratorFlags; for (const auto &dirEntry : QDirListing(dirPath, F::Default)) { const QFileInfo fi = dirEntry.fileInfo(); // Filter based on readable and executable bits if (fi.isReadable() && fi.isExecutable()) { fileNames.append(dirEntry.fileName()); ... } }// QDir::AllDirs causes dirs to always be listed regardless of `nameFilters`; // for example, to list ".so" files in a file dialog and still list all dirs: QDirIterator dit(dirPath, nameFilters, QDir::AllDirs | QDir::NoDotAndDotDot); while (dit.hasNext()) { const QFileInfo fi = dit.nextFileInfo(); ... } // Equivalent code using QDirListing: using F = QDirListing::IteratorFlags; for (const auto &dirEntry : QDirListing(dirPath, F::Default)) { const QFileInfo fi = dirEntry.fileInfo(); if (fi.isDir() || fi.fileName().endsWith(".so"_L1)) { ... } } - QDirListing 을 사용하면 QDir::NoDot, QDir::NoDotDot 및 QDir::NoDotAndDotDot 의 동작이 하나의 플래그로 통합됩니다. 기본적으로 QDirListing 은 특수 항목인
.및..을 나열하지 않습니다. 이를 나열하려면 QDirListing::IteratorFlag::IncludeDotAndDotDot 을 설정하십시오.
심볼릭 링크
기본적으로 QDirIterator 는 QDir::NoSymlinks가 설정되지 않은 경우 심볼릭 링크를 해결하지만, QDirListing 는 QDirListing::IteratorFlag::ResolveSymlinks 가 설정되지 않은 경우 심볼릭 링크를 해결하지 않습니다. 가 설정된 경우, 필터링은 심볼릭 링크 자체가 아닌 심볼릭 링크의 대상 유형을 기준으로 수행됩니다. 예를 들어, 일반 파일과 일반 파일을 가리키는 심볼릭 링크만 나열하려면 QDirListing::IteratorFlag::FilesOnly 와 QDirListing::IteratorFlag::ResolveSymlinks를 설정해야 합니다.
// Symbolic links are resolved by default
QDirIterator dit(dirPath, QDir::Files | QDir::NoDotAndDotDot);
while (dit.hasNext()) {
const QFileInfo fi = dit.nextFileInfo();
fileNames.append(fi.fileName());
...
}
// To preserve the behavior of the code above, set ResolveSymlinks:
using F = QDirListing::IteratorFlags;
for (const auto &dirEntry : QDirListing(dirPath, F::FilesOnly | F::ResolveSymlinks)) {
fileNames.append(dirEntry.fileName());
...
}QDirListing::DirEntry
QDirListing::DirEntry 는 ` QFileInfo`의 API 중 일부(예: `fileName()`, `filePath()`, `exists()`)를 제공합니다. `DirEntry` API의 주요 장점은 다른 방법을 통해 필요한 정보를 이미 확보한 경우, (상당히 비용이 많이 드는) ` stat() ` 또는 ` lstat() ` 호출을 지연시킬 수 있다는 점입니다. 예를 들어, 리눅스에서는 내부적으로 readdir()을 사용하여 디렉터리 트리를 순회하며, 반환된 정보의 일부로 항목의 이름과 유형을 얻습니다. 따라서 파일 이름만 필요한 경우, QDirListing::DirEntry::fileInfo() 대신 QDirListing::DirEntry::fileName()을 사용하십시오. fileName() (QDirListing 은 내부적으로 QFileInfo 를 생성하여 필요할 때 투명하게 사용합니다).
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.