查找目录下所有文件使用到的宏

void sitool::onAsysisSlots()
{
	QString strSiProDir = ui.PathSiProLineEdit->text();
	QString strProRootDir = ui.PathProRootLineEdit->text();
	QString strMakeFileDir = ui.pathMakeFileLineEdit->text();
	
	QString strFlag = ui.flagLineEdit->text();
	QStringList strListFlag = strFlag.split(QString(";"));
	
	QString strFileType = ui.fileTypeLineEdit->text();
	QStringList strListFileType = strFileType.split(QString(";"));

	//找目录下的所有文件匹配到类型的文件
	QString text = "";
	QDirIterator it(strProRootDir, strListFileType, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
	QStringList files;
	while (it.hasNext())
	{
		files << it.next();
	}
	if (!text.isEmpty())
	{
		files = findFiles(files, text);
	}

	//删除临时文件
	if (QFile::exists(GREP_DEFINE_OUTPUT_FILE))
	{
		QFile::remove(GREP_DEFINE_OUTPUT_FILE);
	}

	//找上面过滤出来所有文件类型中匹配到的#if #ifdef #ifndef #elif行并重定向到指定文件,方便后续处理
	if (!processGrep1(files))
	{
		return;
	}
#if 0
	//删除#  //xxx中的//xxx
	if (!processGrep2())
	{
		return;
	}

	if (!processSed3())
	{
		return;
	}
	//
	if (!processSed4())
	{
		return;
	}
#else
	//全部使用QStringList操作
	QFile file(GREP_DEFINE_OUTPUT_FILE);
	file.open(QIODevice::ReadOnly | QIODevice::Text);
	QByteArray t = file.readAll();
	file.close();

	QString str(t);
	//将||替换为换行
	str.replace("||","
");
	//将&&替换为换行	
	str.replace("&&", "
");
	//使用
进行分割
	QStringList list = str.split("
");
	//去除注释//及其后面的内容
	list.replaceInStrings(QRegExp("[/]+.*"), "");
	//去除#if,#ifdef,#ifndef,#elif
	list.replaceInStrings(QRegExp("^s*#[a-z]*s*"), "");
	//删除defined
	list.replaceInStrings("defined", "");
	//删除undef
	list.replaceInStrings("undef", "");
	//删除(,),!
	list.replaceInStrings("(", "");
	list.replaceInStrings(")", "");
	list.replaceInStrings("!", "");
	//删除比较符号
	list.replaceInStrings(QRegExp(">|<|=|<=|>=|=="), "");
	//删除数字
	list.replaceInStrings(QRegExp("[0-9]*s*|s*[0-9]*"), "");
	//删除多余的空格
	list.replaceInStrings(QRegExp(" "), "");
	//删除空行
	list.removeAll(QString(""));
	//去重复
	list.removeDuplicates();
	//做一下排序
	list.sort();
	str.clear();
	str = list.join('
');
	file.open(QIODevice::Truncate | QIODevice::WriteOnly | QIODevice::Text);
	file.write(str.toUtf8());
	file.close();
#endif
}

//查找使用宏的行
bool sitool::processGrep1(QStringList& files)
{
	QProcess process(0);
	process.setStandardOutputFile(GREP_DEFINE_OUTPUT_FILE, QIODevice::Append);
	for (int k = 0; k < files.size(); k++)
	{
		QString program = "grep.exe -E ";
		program.append(""^\s*#if|^\s*#ifdef|^\s*#ifndef|^\s*#elif"");
		program.append(" ");
		QString str = files.at(k);
		str.replace(QString("/"), QString("//"));
		program.append(str);
		program.append("
");
		process.start(program);
		process.waitForStarted();
		process.waitForFinished();
	}
	return true;
}

//找目录下的所有文件
QStringList sitool::findFiles(const QStringList &files, const QString &text)
{
	QMimeDatabase mimeDatabase;
	QStringList foundFiles;

	for (int i = 0; i < files.size(); ++i) {
		const QString fileName = files.at(i);
		const QMimeType mimeType = mimeDatabase.mimeTypeForFile(fileName);
		if (mimeType.isValid() && !mimeType.inherits(QStringLiteral("text/plain"))) {
			qWarning() << "Not searching binary file " << QDir::toNativeSeparators(fileName);
			continue;
		}
		QFile file(fileName);
		if (file.open(QIODevice::ReadOnly)) {
			QString line;
			QTextStream in(&file);
			while (!in.atEnd()) {
				break;
				line = in.readLine();
				if (line.contains(text, Qt::CaseInsensitive)) {
					foundFiles << files[i];
					break;
				}
			}
		}
	}
	return foundFiles;
}
原文地址:https://www.cnblogs.com/kuikuitage/p/12879366.html