目录

QT中使用QDir来表示目录。

  • 如何构造一个QDir对象:使用表示目录的路径字符串,路径是否以”/“结尾不重要。
  • 与新的路径字符串拼凑得到一个新路径字符串: absoluteFilePath 和 filePath,不检查路径是否真实存在,路径中可存在”.”,”..”
  • 目录的绝对路径:absolutePath,不以”/“结尾
  • 其它文件相当于本目录的相对路径:relativeFilePath
  • 查找目录下的文件,可以指定查找规则,指定过滤规则,指定排序规则:entryInfoList、entryList 不会递归查找
  • 得到描述本目录的路径字符串:path(), 描述本路径可以是绝对路径,可以是相对路径
  • 将内部描述本路径的字符串转成绝对路径:makeAbsolute
  • 创建子目录:mkdir
  • 递归创建子目录:mkpath,子目录也可以是与本目录无关的绝对路径
  • 删除子目录下的文件:remove,只要传入的是一个文件,且文件存在就可以,可以是根目录无关的绝对路径。
  • 删除本目录以及本目录下的全部文件:removeRecursively
  • 重命名:rename,借助重命名可以移动文件和文件夹。
  • 删除子目录:rmdir,被删除的目录必须为空目录。可以根本目录没有关系。

总结,很多的接口都可以指定一个子目录/文件的路径,但是其实子目录可以是跟本目录没有直接父子关系的任意目录/文件。关于增删改建议使用如下的接口:

全局静态方法有:

  • cleanPath: 清理路径中不必要的”.”,”..”,整理字符串。
  • current/currentPath
  • home/homePath
  • root/rootPath
  • temp/tempPath
  • toNativeSeparators
  • fromNativeSeparators

除了系统预定的一些目录,比如home/root/current等,项目中还可以手动指定一个名称,给他关联到N个目录,可以同时在这N个目录中进行查找子目录等。这个就是利用到的setSearchPaths、addSearchPath

Poco中使用Poco::Path来表示一个文件或者路径,构造时,如果以”/“结尾则表示目录。

文件信息

QT中使用QFileInfo来表示一个文件,目录也是一个特殊的文件。在构建的时候,是否有”/“结尾就很重要了。QT的QFileInfo设计得并不好,相关接口很容易混淆,同样的接口在对文件和目录时,差别很大。

表示一个文件的,总是有3属性:位置,也可以说时path/dir ;文件名;完整路径描述,filePath;

  • 构建一个QFileInfo,QString、QDir和QString结合、QFile都能表示一个文件,因此都可以用来创建QFileInfo。
  • 文件所在目录:absoluteDir,absolutePath,Dir
  • 目录的位置,非上级目录,不以”/“结尾:absoluteDir,absolutePath
  • 描述FileInfo的内部描述字符串: filePath
  • 内部描述字符串的绝对路径形式,仅仅是路径展开成绝对路径,absoluteFilePath
  • 文件的基本名:baseName、completeBaseName, 目录的基本名为空。
  • isFile,isDir会去查看这个文件系统是否真的存在该文件/目录

构造时,如果以”/“结尾,则当作是目录来处理。至于isFile,isDir返回结果会检查文件系统这是另外一回事。当把它当作目录是,可以看成是位置Path为本身,文件名为空的特殊文件,这样在理解获取相关位置的接口时比较方便。获取位置时,返回的字符串总是不以”/“结束。说它设计的不好是因为,我们在利用QFileInfo获取文件相关信息是,总是无法避免无法正确的处理结尾的分隔符”/“。

Poco中使用Poco::File来描述文件。

常用操作总结

  1. 递归新建目录使用 QDir::mkpath
  2. 菲递归创建目录使用 QDir::mkdir
  3. 只删除空目录使用 QDir::rmdir
  4. 强制递归删除目录使用 QDir::removeRecusively
  5. 删除文件使用 QDir::remove, QFile::remove(静态方法)
  6. 移动和重命名目录使用 QDir::rename
  7. 移动和重命名文件使用 QDir::rename, QFile::rename(有静态方法)
  8. 复制文件: QFile::copy(静态方法)
  9. 判断是否存在: QFile::exists(静态方法),QFileInfo::exists(静态方法)