QFileInfo主要函数详解

部分内容来自:https://blog.csdn.net/Amnes1a/article/details/65444966

QFileInfo简介

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

QFileInfo可以表示绝对路径或相对路径的文件。其中,绝对路径就是以"/"开始的路径(或者在Windows系统上就是以某个盘符开始的路径)。相对路径就是相对于当前工作目录的一个文件或目录。我们在开发中可以使用该类的成员函数isRelative() 来判断一个QFileInfo表示的是一个相对路径还是一个绝对路径,也可以使用makeAbsolute()将一个相对路径转换为一个绝对路径。

可以使用exists() 函数判断一个文件是否存在,使用size()函数获取文件的大小。成员函数isFile()、isDir()、isSymLink() 可以判断文件的类型(普通文件、目录或是符号链接)。

若QFileInfo当前代表的是一个符号链接,symLinkTarget() 函数返回符号链接所指向的文件。在Unix平台上,包括macOS和iOS,符号链接和它所指向的文件具有同样的大小,因为Unix透明的看待普通文件和符号链接;同样,打开一个符号链接进行读写时,其实是打开了它所指向的真实文件。例如:

 #ifdef Q_OS_UNIX
 
  QFileInfo info1("/home/bob/bin/untabify");
  info1.isSymLink();          // returns true
  info1.absoluteFilePath();   // returns "/home/bob/bin/untabify"
  info1.size();               // returns 56201
  info1.symLinkTarget();      // returns "/opt/pretty++/bin/untabify"
 
  QFileInfo info2(info1.symLinkTarget());
  info2.isSymLink();          // returns false
  info2.absoluteFilePath();   // returns "/opt/pretty++/bin/untabify"
  info2.size();               // returns 56201
 
  #endif

在Windows平台上,符号链接是 .lnk 文件,也就是快捷方式。此时,size() 函数返回的是符号链接本身的大小,同样,打开一个 .lnk 文件就是打开 .lnk 文件本身,并不是打开它所指向的真实文件。例如:

#ifdef Q_OS_WIN
 
  QFileInfo info1("C:\\Documents and Settings\\Bob\\untabify.lnk");
  info1.isSymLink();          // returns true
  info1.absoluteFilePath();   // returns "C:/Documents and Settings/Bob/untabify.lnk"
  info1.size();               // returns 743
  info1.symLinkTarget();      // returns "C:/Pretty++/untabify"
 
  QFileInfo info2(info1.symLinkTarget());
  info2.isSymLink();          // returns false
  info2.absoluteFilePath();   // returns "C:/Pretty++/untabify"
  info2.size();               // returns 63942
 
  #endif

扩展

  1. 若QFileInfo代表的是目录,则QFileInfo不会自动在路径后添加一个"/"。如果你需要这个"/",需要自己手动添加。

  2. 在NTFS文件系统上,特别是Windows,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的。要使能这个功能,可以在文件中添加下面这行代码:

extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;

这样一来,我们可以方便的通过递增或递减这个变量使能或禁用权限检查功能:

qt_ntfs_permission_lookup++; // turn checking on
qt_ntfs_permission_lookup--; // turn it off again
  1. 一些QFileInfo函数会查询整个文件系统,但出于性能原因,还有一些函数只操作文件名本身。例如,为了获得一个文件的绝对路径,absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path()函数的运行会更快。
  2. 另外还要注意,为了加速对文件信息的获取,QFileInfo会缓存文件的信息。但另一方面,文件随时都有可能被其他用户或程序,或当前程序的其他函数所改变,所以,QFileInfo还提供了一个refresh() 函数,重新读取文件信息。如果你想关闭该缓存功能,以确保每次访问文件信息时都去访问文件系统获取当前最新的信息,可以通过调用setCaching(false)来完成。

文件名和路径类

函数名 描述
baseName 文件名(不包含完整后缀,不存在.分隔符)
completeBaseName 完整文件名(不包含最后一个后缀,可能存在.分隔符)
suffix 最后一个后缀(从文件名最后一个.分隔符开始)
completeSuffix 完整后缀(从文件名第一个.分隔符开始)
path 返回文件的路径,不包括文件名。但是,如果QFileInfo对象表示的是一个已"/"结尾的路径,那么文件名被认为是空的,此时,该函数返回整个完整路径。
filePath 返回文件名,包括路径(可能是绝对路径,也可能是相对路径)。
fileName 只返回文件名,不包括路径。注意,如果QFileInfo对象表示的是一个以"/"结尾的路径,那么该函数返回空字符串。
dir 返回一个文件父目录路径作为QDir对象。
absoluteDir 返回一个文件绝对路径作为QDir对象。
absolutePath 返回文件的绝对路径,不包括文件名。
absoluteFilePath 返回一个文件名的绝对路径。在Unix系统上,会返回一个已"/"开始的目录;在Windows平台上,返回一个以驱动器盘符开始的目录。
canonicalPath 返回文件路径(不包含文件名),是绝对路径;
canonicalFilePath 规范路径名是绝对路径名,并且是惟一的。规范路径名的准确定义与系统有关。如有必要,此方法首先将路径名转换成绝对路径名,这与调用 absolutefilePath() 方法的效果一样,然后用与系统相关的方式将它映射到其惟一路径名。这通常涉及到从路径名中移除多余的元素(比如“.”和“…”)、分析符号连接(对于 UNIX 平台),以及将驱动器名转换成标准大小写形式(对于 Microsoft Windows 平台)。

文件访问权限类

函数名 描述
isReadable 是否可读
isWriteable 是否可写
isExecutable 是否可执行

文件所有者类

函数名 描述
owner 文件所属者
ownerId 文件所属者的ID
group 文件所属组
groupId 文件所属组的ID

文件相关日期类

函数名 描述
created 文件创建时的日期和本地时间
lastModified 文件最新一次被修改的日期和本地时间
lastRead 文件最新一次被读的日期和本地时间

示例输出

============================relative file path============================
=================QFileInfo("./user/xueying/script.tag.gz")================
baseName--------------------->>> "script"
completeBaseName------------->>> "script.tag"
suffix----------------------->>> "gz"
completeSuffix--------------->>> "tag.gz"
bundleName------------------->>> ""
path------------------------->>> "./user/xueying"
filePath--------------------->>> "./user/xueying/script.tag.gz"
fileName--------------------->>> "script.tag.gz"
absolutePath----------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
absoluteFilePath------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying/script.tag.gz"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "xueying"
absoluteDir().absolutePath--->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
absoluteDir().path----------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
absoluteDir().canonicalPath-->>> ""
dir().dirName---------------->>> "xueying"
dir().absolutePath----------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
dir().path------------------->>> "./user/xueying"
dir().canonicalPath---------->>> ""

============================absolute file path============================
================QFileInfo("E:/project/test/script.tag.gz")================
baseName--------------------->>> "script"
completeBaseName------------->>> "script.tag"
suffix----------------------->>> "gz"
completeSuffix--------------->>> "tag.gz"
bundleName------------------->>> ""
path------------------------->>> "E:/project/test"
filePath--------------------->>> "E:/project/test/script.tag.gz"
fileName--------------------->>> "script.tag.gz"
absolutePath----------------->>> "E:/project/test"
absoluteFilePath------------->>> "E:/project/test/script.tag.gz"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "test"
absoluteDir().absolutePath--->>> "E:/project/test"
absoluteDir().path----------->>> "E:/project/test"
absoluteDir().canonicalPath-->>> "E:/project/test"
dir().dirName---------------->>> "test"
dir().absolutePath----------->>> "E:/project/test"
dir().path------------------->>> "E:/project/test"
dir().canonicalPath---------->>> "E:/project/test"

=====================relative dir path with QDir::sepator()=====================
==========================QFileInfo("./user/xueying/")==========================
baseName--------------------->>> ""
completeBaseName------------->>> ""
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "./user/xueying"
filePath--------------------->>> "./user/xueying/"
fileName--------------------->>> ""
absolutePath----------------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteFilePath------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "user"
absoluteDir().absolutePath--->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().path----------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().canonicalPath-->>> ""
dir().dirName---------------->>> "xueying"
dir().absolutePath----------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
dir().path------------------->>> "./user/xueying"
dir().canonicalPath---------->>> ""

=====================absolute dir path with QDir::sepator()=====================
==========================QFileInfo("E:/project/test/")=========================
baseName--------------------->>> ""
completeBaseName------------->>> ""
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "E:/project/test"
filePath--------------------->>> "E:/project/test/"
fileName--------------------->>> ""
absolutePath----------------->>> "E:/project/test"
absoluteFilePath------------->>> "E:/project/test/"
canonicalPath---------------->>> "E:/project"
canonicalFilePath------------>>> "E:/project/test"
absoluteDir().dirName-------->>> "test"
absoluteDir().absolutePath--->>> "E:/project/test"
absoluteDir().path----------->>> "E:/project/test"
absoluteDir().canonicalPath-->>> "E:/project/test"
dir().dirName---------------->>> "test"
dir().absolutePath----------->>> "E:/project/test"
dir().path------------------->>> "E:/project/test"
dir().canonicalPath---------->>> "E:/project/test"

======================relative dir path no QDir::sepator()======================
============================QFileInfo("./user/xueying")=========================
baseName--------------------->>> "xueying"
completeBaseName------------->>> "xueying"
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "./user"
filePath--------------------->>> "./user/xueying"
fileName--------------------->>> "xueying"
absolutePath----------------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteFilePath------------->>> "E:/project/qt/fileinfoTest/bin/user/xueying"
canonicalPath---------------->>> "."
canonicalFilePath------------>>> ""
absoluteDir().dirName-------->>> "user"
absoluteDir().absolutePath--->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().path----------->>> "E:/project/qt/fileinfoTest/bin/user"
absoluteDir().canonicalPath-->>> ""
dir().dirName---------------->>> "user"
dir().absolutePath----------->>> "E:/project/qt/fileinfoTest/bin/user"
dir().path------------------->>> "./user"
dir().canonicalPath---------->>> ""

======================absolute dir path no QDir::sepator()======================
===========================QFileInfo("E:/project/test")=========================
baseName--------------------->>> "test"
completeBaseName------------->>> "test"
suffix----------------------->>> ""
completeSuffix--------------->>> ""
bundleName------------------->>> ""
path------------------------->>> "E:/project"
filePath--------------------->>> "E:/project/test"
fileName--------------------->>> "test"
absolutePath----------------->>> "E:/project"
absoluteFilePath------------->>> "E:/project/test"
canonicalPath---------------->>> "E:/project"
canonicalFilePath------------>>> "E:/project/test"
absoluteDir().dirName-------->>> "project"
absoluteDir().absolutePath--->>> "E:/project"
absoluteDir().path----------->>> "E:/project"
absoluteDir().canonicalPath-->>> "E:/project"
dir().dirName---------------->>> "project"
dir().absolutePath----------->>> "E:/project"
dir().path------------------->>> "E:/project"
dir().canonicalPath---------->>> "E:/project"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章