一直对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. 【t014】拯数

    [题目链接]:http://noi.qz5z.com/viewtask.asp?id=t014 [题意] [题解] 这个锁的序列,如果把末尾的0去掉; 然后再倒过来; 那么就是这个序列对应的格雷码了; ...

  2. 关于JDBC连接数据库时出现的Public Key Retrieval is not allowed错误

    问题描述 最近在学习MyBatis框架,参考官方的文档通过配置文件的方式已经实现了通过Configuration配置文件和mapper映射文件访问mysql8数据库,于是想试试不使用XML文件去构建S ...

  3. android打包SDK具体操作(包含第三方的jar一起打包)

    一.背景 因为最近编写的android项目,需要编写对应的SDK给别人使用,还好以前我都是拆成module写的,所以还不太费工夫,不过因为一些module里面包含第三方的jar,所以打包有点麻烦 二. ...

  4. 【干货】Chrome插件(扩展)开发全攻略(转)

    写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...

  5. exec 与 open 打开进程

    1 exec ?-keepnewline ?-ignorestderr  args(?号后面表示可以跟的参数) 这个东西一旦执行 , 没有执行完毕父进程会处于等待中 使用一个或多个子进程运行 由arg ...

  6. CUDA+OpenGL混合编程

    CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...

  7. STL关联式容器之set和multiset

    一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指 ...

  8. 计算机程序设计的史诗TAOCP

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:“我只要一把锤子和一个锯”.但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你“我需要一些精确的工具”.由于计算机所解决的问题 ...

  9. Android在putString和getString使用方法

    函数: putString(String key,String value); 功能:将键为key的值为value. 详细的容器详细考虑比如对于Editor 的对象来讲: 代码例如以下: 首先新建一个 ...

  10. 构建自己的PHP框架(视图装载)

    完整项目地址:https://github.com/Evai/Aier 视图装载类要做的工作其实很简单: 1. 根据视图名称找到视图文件,支持文件夹 2. 更加方便,更加优雅地把变量的值传递进视图 本 ...