/** * @author Rick Chan (cy187lion@sina.com) * @date 2014-01-23 */ #include "engine.h" #include #include Engine::Engine(QString proDir, QString schdir, QString fileName, FILE_TYPES selectedFile, QObject *parent) : QThread(parent) { ProDir = proDir; SearchDir = schdir; ProFileName = fileName; FileTypes = selectedFile; } Engine::~Engine() { exit(); this->wait(); } void Engine::run(void) { QFile proFile; proFile.setFileName(ProFileName); proFile.open(QIODevice::ReadWrite); QTextStream *stream; /** 以流的形式获取文件数据 */ stream = new QTextStream( &proFile ); stream->seek(proFile.size()); QString incPath, socFile, hedFile, disFile; incPath.append("\nINCLUDEPATH += "+SearchDir); socFile.append("\nSOURCES += "); hedFile.append("\nHEADERS += "); disFile.append("\nDISTFILES += "); incPath.replace("\\","/"); //如果传入的项目文件路径为空,则以绝对路径方式添加,否则以相对路径方式添加 if(""!=ProDir) { FindAndAddEngine(ProDir, SearchDir, FileTypes, &incPath, &socFile, &hedFile, &disFile); } else { FindAndAddEngine(SearchDir, FileTypes, &incPath, &socFile, &hedFile, &disFile); } *stream<flush(); proFile.close(); emit EngineProcessing(true, 0); } void Engine::FindAndAddEngine(QString schdir, FILE_TYPES ftypes, QString *incPath, QString *socFile, QString *hedFile, QString *disFile) { QDir dir(schdir); /** 开始搜索 */ //设置过滤器(目录,文件或非上级目录) dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot); dir.setSorting(QDir::DirsFirst); //取得目录中文件列表(包含目录) QFileInfoList filelist = dir.entryInfoList(); int i=0; do{ emit EngineProcessing(false, i); if(0==filelist.size()) { return; } QFileInfo fileInfo = filelist.at(i); bool bisDir=fileInfo.isDir(); //判断是否为目录,如果是目录则遍历,否则当前处理文件 if(bisDir) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); incPath->append(" \\\n "+addFile); FindAndAddEngine(fileInfo.absoluteFilePath(), ftypes, incPath, socFile, hedFile, disFile); } else { //取得文件类型后缀 QString extension=fileInfo.suffix().toLower(); /**< Sources */ if(("c"==extension) & (ftypes.Source&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); socFile->append(" \\\n "+addFile); } else if(("c++"==extension) & ((ftypes.Source>>1)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); socFile->append(" \\\n "+addFile); } else if(("cpp"==extension) & ((ftypes.Source>>2)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); socFile->append(" \\\n "+addFile); } else if(("cxx"==extension) & ((ftypes.Source>>3)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); socFile->append(" \\\n "+addFile); } else if(("cc"==extension) & ((ftypes.Source>>4)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); socFile->append(" \\\n "+addFile); } else if(("tcc"==extension) & ((ftypes.Source>>5)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); socFile->append(" \\\n "+addFile); } /**< Headers */ else if(("h"==extension) & (ftypes.Header&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); hedFile->append(" \\\n "+addFile); } else if(("h++"==extension) & ((ftypes.Header>>1)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); hedFile->append(" \\\n "+addFile); } else if(("hpp"==extension) & ((ftypes.Header>>2)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); hedFile->append(" \\\n "+addFile); } else if(("hxx"==extension) & ((ftypes.Header>>3)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); hedFile->append(" \\\n "+addFile); } /**< Others */ else if(("Makefile"==fileInfo.fileName())&&(ftypes.Other&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); disFile->append(" \\\n "+addFile); } else if(("asm"==extension) & ((ftypes.Other>>1)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); disFile->append(" \\\n "+addFile); } else if(("s"==extension) & ((ftypes.Other>>2)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); disFile->append(" \\\n "+addFile); } else if(("xml"==extension) & ((ftypes.Other>>3)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); disFile->append(" \\\n "+addFile); } } i++; }while(iappend(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); FindAndAddEngine(proDir, fileInfo.absoluteFilePath(), ftypes, incPath, socFile, hedFile, disFile); } else { //取得文件类型后缀 QString extension=fileInfo.suffix().toLower(); /**< Sources */ if(("c"==extension) & (ftypes.Source&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("c++"==extension) & ((ftypes.Source>>1)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("cpp"==extension) & ((ftypes.Source>>2)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("cxx"==extension) & ((ftypes.Source>>3)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("cc"==extension) & ((ftypes.Source>>4)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("tcc"==extension) & ((ftypes.Source>>5)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 socFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } /**< Headers */ else if(("h"==extension) & (ftypes.Header&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("h++"==extension) & ((ftypes.Header>>1)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("hpp"==extension) & ((ftypes.Header>>2)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("hxx"==extension) & ((ftypes.Header>>3)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 hedFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } /**< Others */ else if(("Makefile"==fileInfo.fileName())&&(ftypes.Other&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("asm"==extension) & ((ftypes.Other>>1)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("s"==extension) & ((ftypes.Other>>2)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } else if(("xml"==extension) & ((ftypes.Other>>3)&&0x01)) { QString addFile = fileInfo.absoluteFilePath(); addFile.replace("\\","/"); //计算当前文件夹与项目文件所在文件夹的相对路径 disFile->append(" \\\n "+relaDir.relativeFilePath(fileInfo.absoluteFilePath())); } } i++; }while(i