一直对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. 小强的HTML5移动开发之路(24)—— PhoneGap Android开发环境搭建

    有关JDK及Android开发环境的搭建请看我前面的博文:http://blog.csdn.net/dawanganban/article/details/9748497 一.下载PhoneGap 下 ...

  2. oracle常规任务

    # su - oracle  oracle> sqlplus "/as sysdba"  SQL> exec dbms_scheduler.disable('MONDA ...

  3. uva 11552 Fewest Flops 线性dp

    // uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i ...

  4. WPF 海康威视网络摄像头回调方式实现断连提示,降低时延

    原文:WPF 海康威视网络摄像头回调方式实现断连提示,降低时延 项目需要使用海康威视网络摄像头接入实时视频数据,使用海康威视官方SDK开发,发现没有断连提示的功能,故开发了一个断连提示的功能 在开发过 ...

  5. 亲串 (hdu 2203 KMP)

    亲串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  6. SQL_DML简单的操作

    ***********************************************声明*************************************************** ...

  7. Swift 开源那点事儿

    最近各大网站上最喜大普奔的新闻莫过于 Swift 正式开源这条了.这无疑是一个里程碑式的前进,苹果也向开源社区更加进了一步.那么 Swift 开源后有什么具体的改变呢,我们一一道来. 成立开源社区 s ...

  8. asp .net 页面跳转

    ajax异步 通过ajax去请求数据,然后在js里面得到返回结果,赋值location.href <div> <input id="url" /> < ...

  9. ng-alain 复用标签相关设置

    排除复用 import { ReuseTabMatchMode, ReuseTabService } from '@delon/abc'; export class StartupService { ...

  10. Visifire charts ToolBar

    <charts:Chart x:Name="ChartPat" Theme="Theme2" BorderBrush="Gray" P ...