Как искать файл в QDir
Я разрабатываю приложение для MAC OS X. В котором я должен найти файлы в папке. Проблема в том, что я хочу дать пользователю комфорт при поиске файла, введя QString
, Эта QString может быть точным именем файла или текстом, содержащимся в имени файла. Предположим, имя файла "mysamplefile.txt"
, Так что если пользователь введет либо 'my'
; 'mysample'
; 'samplefile'
; 'mysamplefile'
или же 'mysamplefile.txt'
, Во всех случаях я хочу получить QFileInfo
для этого файла. Я также даю флажок вариант 'Match Case'
или же 'Ignore case'
пользователю, чтобы получить fileinfo
, у меня есть QStringList
для strings
этот пользователь хочет искать, и у меня также есть QStringList
из мест, выбранных пользователем. Поэтому я хочу искать каждое имя строки (из QStringList strSearchFileName
) на каждом пути (QStringList searchingdirectorylist
). И я хочу сделать финал QFileInfoList
для всех файлов после процесса поиска.
void MainWindowWipe::onSearchingProcess(QStringList strSearchFileName, QStringList searchingdirectorylist)
{
for(int i=0; i<strSearchFileName.size();i++)
{
for(j=0; j<searchingdirectorylist.size();j++)
{
QDir dir(searchingdirectorylist[j]);
dir.setNameFilters(QStringList(strSearchFileName[i]));
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
QFileInfoList fileList = dir.entryInfoList();
for (int k=0; k<fileList.count(); k++)
{
QString temp = "";
temp = fileList[k].absoluteFilePath();
}
dir.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
QStringList dirList = dir.entryList();
QStringList newList;
for (int l=0; l<dirList.size(); ++l)
{
QString newPath = QString("%1/%2").arg(dir.absolutePath()).arg(dirList.at(i));
newList<<newPath;
onSearchingProcess(strSearchFileName,newList);
}
}
}
}
Эта функция не работает для меня, эта работа только тогда, когда я ищу только один файл с точным именем. Но я хочу найти несколько файлов с не точным именем.
1 ответ
Вам нужно перебрать все файлы и папки с помощью рекурсивной функции (или использовать итератор). На каждой итерации вы можете использовать QString::contains()
чтобы узнать, содержит ли имя файла целевую строку. Сохраните каждое соответствующее имя файла в списке.
#include <QCoreApplication>
#include <QDebug>
#include <QDirIterator>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString targetStr = "init"; // What we search for
QFileInfoList hitList; // Container for matches
QString directory = "D:/python/"; // Where to search
QDirIterator it(directory, QDirIterator::Subdirectories);
// Iterate through the directory using the QDirIterator
while (it.hasNext()) {
QString filename = it.next();
QFileInfo file(filename);
if (file.isDir()) { // Check if it's a dir
continue;
}
// If the filename contains target string - put it in the hitlist
if (file.fileName().contains(targetStr, Qt::CaseInsensitive)) {
hitList.append(file);
}
}
foreach (QFileInfo hit, hitList) {
qDebug() << hit.absoluteFilePath();
}
return a.exec();
}