diff --git a/include/dfm-io/dfm-io/denumerator.h b/include/dfm-io/dfm-io/denumerator.h index f719b46..27d0e24 100644 --- a/include/dfm-io/dfm-io/denumerator.h +++ b/include/dfm-io/dfm-io/denumerator.h @@ -112,6 +112,7 @@ class DEnumerator : public QEnableSharedFromThis DEnumeratorFuture *asyncIterator(); void startAsyncIterator(); bool isAsyncOver() const; + bool initEnumerator(const bool oneByone = true); private: QSharedPointer d; diff --git a/src/dfm-io/dfm-io/denumerator.cpp b/src/dfm-io/dfm-io/denumerator.cpp index f566a41..8817637 100644 --- a/src/dfm-io/dfm-io/denumerator.cpp +++ b/src/dfm-io/dfm-io/denumerator.cpp @@ -231,9 +231,8 @@ bool DEnumeratorPrivate::checkFilter() return ret; } -FTS *DEnumeratorPrivate::openDirByfts() +bool DEnumeratorPrivate::openDirByfts() { - FTS *fts { nullptr }; QString path = q->uri().path(); if (path != "/" && path.endsWith("/")) path = path.left(path.length() - 1); @@ -259,10 +258,10 @@ FTS *DEnumeratorPrivate::openDirByfts() if (nullptr == fts) { qWarning() << "fts_open open error : " << QString::fromLocal8Bit(strerror(errno)); error.setCode(DFMIOErrorCode::DFM_IO_ERROR_FTS_OPEN); - return nullptr; + return false; } - return fts; + return true; } void DEnumeratorPrivate::insertSortFileInfoList(QList> &fileList, QList> &dirList, FTSENT *ent, FTS *fts, const QSet &hideList) @@ -692,8 +691,10 @@ QList> DEnumerator::fileInfoList() QList> DEnumerator::sortFileInfoList() { - FTS *fts = d->openDirByfts(); - if (!fts) + if (!d->fts) + d->openDirByfts(); + + if (!d->fts) return {}; QList> listFile; @@ -702,7 +703,7 @@ QList> DEnumerator::sortFileInfoList() const QUrl &urlHidden = QUrl::fromLocalFile(d->uri.path() + "/.hidden"); hideList = DLocalHelper::hideListFromUrl(urlHidden); while (1) { - FTSENT *ent = fts_read(fts); + FTSENT *ent = fts_read(d->fts); if (ent == nullptr) { break; @@ -716,11 +717,11 @@ QList> DEnumerator::sortFileInfoList() if (QString(ent->fts_path) == d->uri.path() || flag == FTS_DP) continue; - d->insertSortFileInfoList(listFile, listDir, ent, fts, hideList); + d->insertSortFileInfoList(listFile, listDir, ent, d->fts, hideList); } - fts_close(fts); - fts = nullptr; + fts_close(d->fts); + d->fts = nullptr; if (d->isMixDirAndFile) return listFile; @@ -751,3 +752,18 @@ bool DEnumerator::isAsyncOver() const { return d->asyncOvered; } + +bool DEnumerator::initEnumerator(const bool oneByone) +{ + if (d->async) + return true; + + if (oneByone) { + if (d->inited) + return true; + return d->init(); + } + if (d->fts) + return true; + return d->openDirByfts(); +} diff --git a/src/dfm-io/dfm-io/private/denumerator_p.h b/src/dfm-io/dfm-io/private/denumerator_p.h index 6b8cb6a..b35d265 100644 --- a/src/dfm-io/dfm-io/private/denumerator_p.h +++ b/src/dfm-io/dfm-io/private/denumerator_p.h @@ -45,7 +45,7 @@ class DEnumeratorPrivate : public QObject, public QEnableSharedFromThis> &fileList, QList> &dirList, FTSENT *ent, @@ -91,6 +91,7 @@ class DEnumeratorPrivate : public QObject, public QEnableSharedFromThis