Как посчитать количество файлов/папок по конкретному пути?

Рейтинг: 1Ответов: 1Опубликовано: 17.01.2023

Нужно написать что-то вроде файлового менеджера.

Как посчитать количество файлов в каждом каталоге куда я перехожу по двойному нажатию на qtreeview?

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

       // пример. Тут выводит количество папок в каталоге /users
    QDir dir;
    dir.setPath("/Users");
    QStringList str = dir.entryList();
    str.removeFirst();str.removeFirst();
    int res = str.count();
    qDebug() << res;
    qDebug() << str;
    //

    infoList = new QFileInfoList();
    model = new QFileSystemModel(this);
    model->setRootPath("");

    ui->treeView->setModel(model);
    ui->lineEdit_filepath->setText(QDir::currentPath());
    ui->lineEdit_filepath->setReadOnly(true);
}

UPD: Нужна функция подсчета размера каталогов) Моя крашится

long int MainWindow::getSize(QString path)
{
    long double total_size = 0;
    QDir current(path);
    *infoList = current.entryInfoList();
    infoList->removeFirst();infoList->removeFirst();

    for(QFileInfo x : *infoList)
    {
        QString filename = x.fileName();
        if(filename.isEmpty())
            continue;
        if(x.isDir())
        {
            if(path == "/")
                total_size += getSize(path + filename);
            else
                total_size += getSize(path+"/"+filename);
            continue;
        }
        else
            total_size += x.size() ;
        }
       }

return total_size ;
}

Ответы

▲ 1

Надо использовать entryInfoList с параметрами.

QDir::Files - вернёт список файлов

QDir::Dirs - папок

Пример для папок:

QDir dir;

// Получить папки без папок "." и ".."
QFileInfoList d = dir.entryInfoList(QDir::Dirs | QDir::NotDot | QDir::NotDotDot);
d.count(); 

Для файлов аналогично.

Если надо узнать "в один проход" что есть что, то лучше определять тип объекта в цикле:

QFileInfoList d = dir.entryInfoList(QDir::NotDot | QDir::NotDotDot);

int qtyFiles = 0, qtyDirs = 0;
for(int i = 0; i < d.count(); i++) {
    QFileInfo info = d[i];
    if ( info.isFile() ) {
        qtyFiles++;
    } else if ( info.isDir() ) {
        qtyDirs++;
    }
}