如何在 QDir 中搜索文件
How to Search a file in QDir
我正在为 MAC OS X 开发一个应用程序。我必须在其中找到文件夹中的文件。问题是我想让用户放心,通过输入 QString
来搜索文件。此 QString 可能是文件的确切名称或文件中包含的文本 name.Suppose 文件名是 "mysamplefile.txt"
。因此,如果用户输入 'my'
; 'mysample'
; 'samplefile'
; 'mysamplefile'
或 'mysamplefile.txt'
。在所有情况下,我都想获取该文件的 QFileInfo
。我还向用户提供复选框选项 'Match Case'
或 'Ignore case'
以获得 fileinfo
。我有一个 QStringList
用于用户想要搜索的 strings
,我还有一个 QStringList
由用户选择的位置。所以我想在每个路径(QStringList searchingdirectorylist
)中搜索每个字符串名称(来自QStringList strSearchFileName
)。我想在搜索过程后对所有文件进行最终 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);
}
}
}
}
这个功能对我不起作用,只有当我只搜索一个具有确切名称的文件时才起作用。但是我想搜索多个名称不准确的文件。
您需要使用递归函数(或使用迭代器)遍历所有文件和文件夹。在每次迭代中,您可以使用 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();
}
我正在为 MAC OS X 开发一个应用程序。我必须在其中找到文件夹中的文件。问题是我想让用户放心,通过输入 QString
来搜索文件。此 QString 可能是文件的确切名称或文件中包含的文本 name.Suppose 文件名是 "mysamplefile.txt"
。因此,如果用户输入 'my'
; 'mysample'
; 'samplefile'
; 'mysamplefile'
或 'mysamplefile.txt'
。在所有情况下,我都想获取该文件的 QFileInfo
。我还向用户提供复选框选项 'Match Case'
或 'Ignore case'
以获得 fileinfo
。我有一个 QStringList
用于用户想要搜索的 strings
,我还有一个 QStringList
由用户选择的位置。所以我想在每个路径(QStringList searchingdirectorylist
)中搜索每个字符串名称(来自QStringList strSearchFileName
)。我想在搜索过程后对所有文件进行最终 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);
}
}
}
}
这个功能对我不起作用,只有当我只搜索一个具有确切名称的文件时才起作用。但是我想搜索多个名称不准确的文件。
您需要使用递归函数(或使用迭代器)遍历所有文件和文件夹。在每次迭代中,您可以使用 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();
}