一直对Qt的isFile、isDir、exists这几个方法感到混乱,不知道到底用哪个,网上搜了下资料,也是用这几个方法
但是都没有对其深究,经过测试发现会存在问题,先看看下面的测试代码

  1. {
  2. QFileInfo fi("C:/123");                     // 目录存在
  3. qDebug() << fi.isFile();                    // false
  4. qDebug() << fi.isDir();                     // true
  5. qDebug() << fi.exists();                    // true
  6. qDebug() << fi.isRoot();                    // false
  7. qDebug() << QFile::exists("C:/123");        // true
  8. qDebug() << QDir("C:/123").exists();        // true
  9. fi.setFile("C:/ABC");                       // 目录不存在
  10. qDebug() << fi.isFile();                    // false
  11. qDebug() << fi.isDir();                     // false
  12. qDebug() << fi.exists();                    // false
  13. qDebug() << fi.isRoot();                    // false
  14. qDebug() << QFile::exists("C:/ABC");        // false
  15. qDebug() << QDir("C:/ABC").exists();        // false
  16. fi.setFile("C:/");                          // 存在的驱动器
  17. qDebug() << fi.isFile();                    // false
  18. qDebug() << fi.isDir();                     // true
  19. qDebug() << fi.exists();                    // true
  20. qDebug() << fi.isRoot();                    // true
  21. qDebug() << QFile::exists("C:/");           // true
  22. qDebug() << QDir("C:/").exists();           // true
  23. fi.setFile("Z:/");                          // 不存在的驱动器
  24. qDebug() << fi.isFile();                    // false
  25. qDebug() << fi.isDir();                     // false
  26. qDebug() << fi.exists();                    // false
  27. qDebug() << fi.isRoot();                    // false
  28. qDebug() << QFile::exists("Z:/");           // false
  29. qDebug() << QDir("Z:/").exists();           // false
  30. fi.setFile("C:/123.lnk");                   // 快捷方式存在且指向的文件也存在
  31. qDebug() << fi.isFile();                    // true
  32. qDebug() << fi.isDir();                     // false
  33. qDebug() << fi.exists();                    // true
  34. qDebug() << fi.isRoot();                    // false
  35. qDebug() << QFile::exists("C:/123.lnk");    // true
  36. qDebug() << QDir("C:/123.lnk").exists();    // false
  37. fi.setFile("C:/456.lnk");                   // 快捷方式存在但指向的文件不存在
  38. qDebug() << fi.isFile();                    // false
  39. qDebug() << fi.isDir();                     // false
  40. qDebug() << fi.exists();                    // false
  41. qDebug() << fi.isRoot();                    // false
  42. qDebug() << QFile::exists("C:/456.lnk");    // false
  43. qDebug() << QDir("C:/456.lnk").exists();    // false
  44. }

可以看到,容易让人感到混乱的是exists方法,这个方法是通用的判断方法,可以看成是这样的表达式

exists() == (isFile() || isDir())

这也是我想说明的问题,网上一些博文中提出的判断文件或文件夹用exists方法是不严谨的
比如你的本意是判断文件是否存在,但文件不存在,而恰巧有个同名的文件夹,那么exists也会返回true。文件夹也是同理

根据上面的代码作出的一点总结

准确判断文件是否存在

1.用QFileInfo::isFile()方法

准确判断文件夹是否存在
1.用QFileInfo::isDir()方法
2.用QDir::exists()方法

不确定字符串是文件还是文件夹路径
1.用QFileInfo::exists()方法
2.用QFile::exists()方法

http://blog.csdn.net/aqtata/article/details/18016467

Qt:正确判断文件、文件夹是否存在的方法的更多相关文章

  1. Qt 如何判断文件是不是一个目录

    做个文件管理系统的时候碰到的question,下面来讲解下方法,因为在网上都没找到,就只能翻官方文档相关信息结果找到isFile(),isDir(); 因为是文件管理系统,那么肯定现先获取到它的路径以 ...

  2. Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  3. JAVA之旅(二十八)——File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤

    JAVA之旅(二十八)--File概述,创建,删除,判断文件存在,创建文件夹,判断是否为文件/文件夹,获取信息,文件列表,文件过滤 我们可以继续了,今天说下File 一.File概述 文件的操作是非常 ...

  4. C/C++判断文件/文件夹是否存在 转

    一.判断文件夹是否存在:     1.用CreateDirectory(".//FileManege",NULL);如果文件夹FileManege不存在,则创建.     2.或者 ...

  5. Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  6. Python判断文件和文件夹是否存在的方法

    Python判断文件和文件夹是否存在的方法 这篇文章主要介绍了Python判断文件和文件夹是否存在的方法,本文还讲解了判断是否为文件或者目录的方法.os.path.lexist的作用.FTP中判断文件 ...

  7. 个人永久性免费-Excel催化剂功能第41波-文件文件夹相关函数

    对于日常办公过程中,每天面对的操作离不开文件.文件夹的操作,当然可以用资源管理器.Everything之类的管理软件来管理.但涉及到批量操作时,在Excel环境或许是个更好的方式,前面很多的内容中不断 ...

  8. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  9. R语言学习笔记之: 论如何正确把EXCEL文件喂给R处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html ---- 前言: 应用背景兼吐槽 继续延续之前每个月至少一次更新博客,归纳总结学习心得好习惯. ...

  10. NSFileManager计算文件/文件夹大小

    在一些软件中,一般都会给用户展现当前APP的内存,同时用户可以根据自己的需要来清除缓存的内容.一般而言,文件夹是没有大小这个属性的,所以需要遍历文件夹的内容来计算文件夹的大小,下面用NSFileMan ...

随机推荐

  1. js取json对象的键和值

    //构建一个json对象 var pinpai = { "0":{"美的":49,"三星":35,"海信":25,&qu ...

  2. 微信小程序实例:实现tabs选项卡效果

    最近微信应用号是炒的如火如荼,热门满满,但是也可以发现搜索关键词出来,各类网站出现的还都是微信的官方文档解释.正好赶上这个热潮,这几天先把小程序技术文档看了个遍,就直接着手写案例了.很多组件微信内部已 ...

  3. git merge与rebase

    参考这篇文章 Git 之 merge 与 rebase 的区别  文章2 另外,使 rebase出现冲突后,先修改冲突,然后git add 某文件(我使用add  .经常有问题),然后git reba ...

  4. 在这里23种经典设计模式UML类图汇总

    创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就 ...

  5. WPF 修改图片颜色

    原文:WPF 修改图片颜色 本文告诉大家如何修改图片的颜色,如去掉图片的蓝色 在 WPF 可以使用很多图片处理的方法,本文告诉大家的是一个图片处理,可以把处理的图片保存在文件. 在阅读本文,我假设大家 ...

  6. Diffie-Hellman Key Exchange – A Non-Mathematician’s Explanation

    The Complete Diffie-Hellman Key Exchange Diagram The process begins when each side of the communicat ...

  7. 在.net MVC项目中使用ajax进行数据验证

    1.首先要在网页引入应该引入的js文件 在这里回顾一下在模板页里面挖坑的技术 2.在html中使用html辅助方法 3.验证模型 4验证方法

  8. 简明Python3教程 9.函数

    简介 函数是程序的可复用片段,允许你为语句块赋予名字之后在程序的任何地方运行它们任意次,这称做函数调用. 我们已经使用过一些内建函数,例如len和range等. 函数也许是任何有意义的软件中最重要的构 ...

  9. WPF中利用RadialGradient模拟放大镜效果

    原文:WPF中利用RadialGradient模拟放大镜效果 --------------------------------------------------------------------- ...

  10. Python 辨异 —— __init__ 与 __new__

    __init__ 更多的作用是初始化属性,__new__ 进行的是创建对象,显然 __new__ 要早于 __init__ 发生. 考虑一个继承自 tuple 的类,显然在 __init__ 无法对其 ...