这三个类相互有关联,但是有不尽相同,首先从名字上看,QDir 和 QDirIterator 是针对于文件目录的,也就是文件夹,我们知道,对于一个文件夹,可以包含很多文件,也可以包含其他文件夹,通常是一个树的结构。文件夹里还可以包含符号链接,符号链接是指向其他文件或文件夹的一种链接,和Windows系统中的快捷方式有些类似,具体可参考这里。而QFileInfo主要是针对某一个具体的文件,来保存和这个文件相关的所有信息,比如文件名,路径啥的。下面来看一个例子,是通过递归方法来查询所有.mp3文件:

void recurseAddDir(QDir d, bool recursive=true, bool symlinks=false ) {
d.setSorting( QDir::Name );
QDir::Filters df = QDir::Files | QDir::NoDotAndDotDot;
if (recursive) df |= QDir::Dirs;
if (not symlinks) df |= QDir::NoSymLinks;
QStringList qsl = d.entryList(df, QDir::Name | QDir::DirsFirst);
foreach (const QString &entry, qsl) {
QFileInfo finfo(d, entry);
if ( finfo.isDir() ) {
QDir sd(finfo.absoluteFilePath());
recurseAddDir(sd);
} else {
if (finfo.completeSuffix()=="mp3")
addMp3File(finfo.absoluteFilePath());
}
}
}

上面那个例子在递归函数recurseAddDir()中调用了功能函数addMp3File(),严重的限制了该函数的可重用性,下面来看用Iterator Pattern来实现的版本:

int main (int argc, char* argv[]) {
QCoreApplication app(argc, argv);
QDir dir = QDir::current();
if (app.arguments().size() > ) {
dir = app.arguments()[];
}
if (!dir.exists()) {
cerr << dir.path() << " does not exist!" << endl;
usage();
return -;
}
QDirIterator qdi(dir.absolutePath(),
QStringList() << "*.mp3",
QDir::NoSymLinks | QDir::Files,
QDirIterator::Subdirectories );
while (qdi.hasNext()) {
addMp3File(qdi.next());
}
}

这样设计的好处是提高了代码可重用性,而且更简单了,这就是Design Pattern的魅力所在。

QDir, QFileInfo 和 QDirIterator 区别的更多相关文章

  1. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...

  2. 使用QFileInfo类获取文件信息(文件的所有权和权限检查在默认情况下是被禁用的。要使能这个功能 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;)

    QFileInfo类为我们提供了系统无关的文件信息,包括文件的名字和在文件系统中位置,文件的访问权限,是否是目录或符合链接,等等.并且,通过这个类,可以修改文件的大小和最后修改.读取时间.同时,QFi ...

  3. QT学习之文件系统读写类

    #QT学习之文件系统读写类 QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileIn ...

  4. Qt4与Qt3的主要不同

    Qt4与Qt3的主要不同 1)QT4 中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的 工作是巨大的,这 ...

  5. 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)

    需求   在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习.   工具和源码下载地址   本篇文章的应用包和源码包可在 ...

  6. 第十七篇 -- QTreeWidget与QDockWidget

    效果图: 目录和工具条的创建在前面几节就已经学过了,所以目录和工具条的布局可以自己画. 那么下面的部分,左侧是一个DockWidget,里面放置一个TreeWidget.右边是一个ScrollArea ...

  7. 文件操作类(QFileDialog、QFileInfo、QDir、QDirIterator、QFile)

    一.QFileDialog 用于弹出打开或保存对话框,然后返回选择的文件或文件夹 1.可以筛选所需要的文件类型 2.可以设置是否多选 3.可以设置保存还是打开 二.QFileInfo 保存了文件相关信 ...

  8. QT文件(夹)操作---QFile、QDir、QFileInfo、QTextStream和QDataStream异同

    1.1    文件和目录 QFile.QBuffer和QTcpSocket可支持读写设备,用open函数打开,用write或putChar函数写入.用read和readLine或readAll进行读取 ...

  9. QDir的mkdir和mkpath区别

    mkdir:上层目录不存在时,创建会失败.比如创建“c:\\test\test”,如果test不存在,那test也创建不了.目录已经存在时会返回false. mkpath:上层目录不存在也没关系,自动 ...

随机推荐

  1. jQuery属性,方法操作

     addClass() 向匹配的元素添加指定的类名.attr() 设置或返回匹配元素的属性和值.hasClass() 检查匹配的元素是否拥有指定的类.html() 设置或返回匹配的元素集合中的 HTM ...

  2. java Long的iniValue出错

    Long l1 = 2500000000L; l1.intValue() 的值是负数 这里 System.out.println(Integer.MAX_VALUE); // 2147483647最大 ...

  3. 写了一个字符串的二维表: TSta

    STA 单元 (用到 System.SysUtils.TStringHelper): --------------------------------------------------------- ...

  4. POJ1704 Georgia and Bob (阶梯博弈)

    Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Subm ...

  5. 解决Unable to locate Kerberos realm

    在windows环境下 将服务器上的/etc/krb5.conf 复制到<jdk-home>/jre/lib/security

  6. ios 7.1.2 拍照声音

    打开进入文件系统(越狱)目录:/System/Library/Frameworks/MediaToolbox.framework , 重命名文件 RegionalSystemSoundsThatSha ...

  7. .net自定义事件,经典简单实例代码

    1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...

  8. 联系旭日150安装CentOS5.X版本手记

    有一台旧电脑.想装个Linux.于是上网查了查.据说可以装CentOS5.3.于是我就去下载了一个. 下载地址可以到http://www.centoscn.com/去下载. 我先下载的是5.3版本的I ...

  9. 关于PHP数组转字符串详细介绍

    随着时代的发展,我们的开发技术也随着更新,对于PHP还是比较常用的,于是我研究了一下PHP数组转字符串,在这里拿出来和大家分享一下,希望对大家有用. 经常需要使用PHP处理字符string,PHP内置 ...

  10. Struts2拦截器原理以及实例

    一.Struts2拦截器定义 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...