Qt之操作文件夹和文件

来源:互联网 发布:网络施工系统报价清单 编辑:程序博客网 时间:2024/06/06 08:57
Task:
之前在学习《C++PrimerPlus》的时候,照着程序清单和练习题,用VS新建了许多个工程。由于VS在编译和运行工程的时候,会产生一些临时文件夹和临时文件,如“.sdf”“Debug”等,非常占空间。现需要将这些临时文件夹和临时删除,以便打包压缩所有的有效工程代码。
由于有上百个工程,逐个手工删除效率很低,而且每次用VS打开工程又会重新生成这些临时文件,非常烦恼。故想编一个小工具软件,能够自动迭代文件目录,删除指定名称和类型的文件和文件夹。

Solution:
1,QDir、QFileInfo和QDirIterator (参考《An Introduction of DesignPatterns in C++ with Qt》)
Qt提供了几种独立于平台的方法来遍历目录树。利用QDir和QFileInfo类,可以获得目录的内容列表以及关于每一个项的信息。
2,迭代器模式、递归函数(recursion)、向下迭代、文件过滤
注:参考Qt之操作文件和文件夹

一、使用QDirIterator遍历目录树,搜索指定文件
新建一个“main.cpp”文件,添加代码如下:
#include
QTextStream cout(stdout);
QTextStream cerr(stderr);

void listSdfFile(QString path) {
    cout << path<< endl;
}
void usage() {
    cout << "Usage:  diriterator [path]" << endl;
    cout << "     prints outa list of sdf files it can find below [path] or current directory."<< endl;
}

//start
int main (int argc, char* argv[]) {
    QCoreApplicationapp(argc, argv);
    QDir dir =QDir::current();
    if(app.arguments().size() > 1) {
       dir = app.arguments()[1];
    }
    if (!dir.exists()){
       cerr << dir.path() << " does notexist!" << endl;
       usage(); 
       return -1;
    }
    QDirIteratorqdi(dir.absolutePath(),
          QStringList() << "*.sdf",
          QDir::NoSymLinks | QDir::Files,
          QDirIterator::Subdirectories );
    while (qdi.hasNext()){
       listSdfFile(qdi.next());
    }
}
//end
使用qmake去生成工程文件,并编译生成“diriterator.exe”。再使用cmd执行以下操作:
Qt之操作文件夹和文件

如上图所示,该操作显示了全部".sdf"文件。
注:cmd命令不支持空格,对文件路径有空格的,可以使用双引号包裹。

二、搜索文件夹
修改上述代码的对应部分如下:
QDirIterator qdi(dir.absolutePath(),
       QStringList() << "ipch",
       QDir::NoSymLinks |QDir::Dirs,
       QDirIterator::Subdirectories );
    while (qdi.hasNext()){
       listDir(qdi.next());
执行CMD命令:
Qt之操作文件夹和文件
同样的方法也可以搜索“Debug"文件夹。

三、添加删除文件和文件夹的代码,替换之前的”list“函数
1,删除文件
QFile::remove(qdi.next());   //listSdfFile(qdi.next());   

2,删除文件夹
    QDirIteratorqdi(dir.absolutePath(),
       QStringList() << "ipch" <<"Debug",
       QDir::NoSymLinks |QDir::Dirs,
       QDirIterator::Subdirectories );
    while (qdi.hasNext()){
       //listDir(qdi.next());
       QDir targetDir(qdi.next());
       targetDir.removeRecursively();
    }

四、浅谈“迭代器模式”
QDirIterator是Qt提供的一个跨平台的文件目录迭代器,它将文件系统目录中的目录和文件(树的节点和子节点,树的枝和叶)统一看作项(entry)。在遍历的时候,无须区分目录和文件,超越了树结构的特殊性,用户不用关注目录嵌套,将树结构当成一般的线性结构,逐项迭代。这样,一次迭代即可访问整个目录树。
如果使用普通的for或foreach循环来遍历目录树,需要区分目录和文件,也需要用户关心目录嵌套,逐级进行遍历,然后设计递归函数进行子孙级层次的遍历。




0 0