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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值