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


    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;
    }
    
  • 相关阅读:
    异常单据锁定涉及的数据库表
    用友通只启用核算模块
    一个迟到MM如何让老师疯掉的
    偷偷看,别笑出声啊
    安装时又提示删除程序
    自动折行的设置
    酒后百态新编 恶搞
    系统管理中“站点”“运行状态”的含义
    神经病女士银行取钱
    HDOJ 1017
  • 原文地址:https://www.cnblogs.com/kuikuitage/p/12879366.html
Copyright © 2020-2023  润新知