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

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

可以使用exists() 函数判断一个文件是否存在,使用size()函数获取文件的大小。isFile()、isDir()、isSymLink() 可以判断文件的类型,普通文件、目录或是符号链接。 若QFileInfo 当前代表的是一个符号链接,sysLinkTarget() 函数返回符号链接所指向的文件。在Unix平台上,包括OSX和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

关于文件名的一些元素可以通过path() 和 fileName() 获取。其中,fileName() 有可能具有后缀等信息,可以使用baseName()、suffix() 或 completeSuffix() 来获取。但是,若QFileInfo代表的是目录,则QFileInfo不会自动在路径后添加一个"/"。如果你需要这个"/",需要自己手动添加。
文件的相关日期可以使用created()、lastModified()和lastRead() 获取;而有关文件访问权限的相关信息可以通过isReadable()、isWriteable()和isExecutable() 获得;文件的所有者信息可以通过owner()、ownerId()、group()和groupId() 获得。

注意,在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

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

下面我们就来具体看一下QFileInfo类常用的成员函数。首先,从构造函数开始:

QFileInfo()
QFileInfo(const QString &file)
QFileInfo(const QFile &file)
QFileInfo(const QDir &dir, const QString &file)
QFileInfo(const QFileInfo &fileinfo)
这些构造函数只是只是接受不同的参数类型而已。其中,对应第三个构造函数来说,如果dir是一个相对路径,QFileInfo也会是相对路径;如果file是绝对路径,那么,dir参数会被忽略。

紧接着,我们主要来看一看,QFileInfo类中能返回文件在文件系统中的位置的函数,在此,对它们的返回值进行一下明确。

QDir QFileInfo::absoluteDir() const
返回一个代码文件绝对路径的QDir对象。
QString QFileInfo::absoluteFilePath() const
返回一个保护文件名的绝对路径。在Unix系统上,会返回一个已"/"开始的目录;在Windows平台上,返回一个已驱动器盘符开始的目录,如"C:\";例如:
QFileInfo fi("C:/temp/foo"); => fi.absoluteFilePath() => "C:/temp/foo"。

QString QFileInfo::absolutePath() const
返回文件的绝对路径,不包括文件名。
QString QFileInfo::fileName() const
只返回文件名,不包括路径。例如:
QFileInfo fi("/tmp/archive.tar.gz");
QString name = fi.fileName(); // name = "archive.tar.gz"
注意,如果QFileInfo对象表示的是一个已"/"结尾的路径,那么该函数返回空字符串。
QString QFileInfo::filePath() const
返回文件的名字,包括路径(可能是绝对路径,也可能是相对路径)
QString QFileInfo::path() const
返回文件的路径,不包括文件名。但是,如果QFileInfo对象表示的是一个已"/"结尾的路径,那么文件名被认为是空的,此时,该函数返回整个完整路径。

具体看了每个函数的返回值含义后,我们再通过一个例子,打印出每个函数的返回值,直观的看一看每个函数的意思,以便加深印象和理解。
新建一个Qt控制台程序,然后在当前目录下新建test目录,在test目录在新建一个test.txt文件,一会我们就以这个文件来测试我们的程序。

程序代码如下:

#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QDir>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QFileInfo info("test/test.txt");
if(!info.exists())
{
qDebug() << "error";
return 0;
}

//返回一个代码文件绝对路径的QDir对象。
qDebug() << "absoluteDir: " << info.absoluteDir();

//返回一个包含文件名的绝对路径
qDebug() << "absoluteFilePath: " << info.absoluteFilePath();

//返回文件的绝对路径,不包括文件名。
qDebug() << "absolutePath: " << info.absolutePath();

//只返回文件名,不包括路径。例如:
qDebug() << "fileName: " << info.fileName();

//返回文件的名字,包括路径(可能是绝对路径,也可能是相对路径)
qDebug() << "filePath: " << info.filePath();

//返回文件的路径,不包括文件名。
qDebug() << "path: " << info.path();

return a.exec();
}

程序输出结果如下:

由此可以看到,各个函数之间的区别。大家在使用过程中,要根据自己的需求,调用正确的函数。
---------------------
作者:求道玉
来源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/65444966
版权声明:本文为博主原创文章,转载请附上博文链接!

使用QFileInfo类获取文件信息(文件的所有权和权限检查在默认情况下是被禁用的。要使能这个功能 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;)的更多相关文章

  1. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...

  2. Android之使用MediaMetadataRetriever类获取媒体信息

    一.昨天.介绍了使用MediaMetadataRetriever类来获取视频第一帧:http://blog.csdn.net/u012561176/article/details/47858099,今 ...

  3. target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件

    target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件

  4. Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息

    由于我的应用在获取到经纬度后在Android8.0不能使用如下代码获取位置信息.只好使用百度地图 WEB服务API 通过调接口的方式获取位置信息. Geocoder geocoder = new Ge ...

  5. 【转载】钉钉开发c#帮助类 获取用户信息 DingHelper.cs

    using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...

  6. 钉钉开发c#帮助类 获取用户信息 DingHelper.cs

    using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...

  7. ASP.NET Webform或者ASP.NET MVC站点部署到IIS下,默认情况下.json文件是不能被访问的,如果请求访问.json文件,则会出现找不到文件的404错误提示

    解决方法 <system.webServer> <staticContent> <remove fileExtension=".woff" /> ...

  8. 继承时,当父子类都具有相同的成员变量,默认情况下是直接调用子类的成员变量,当要调用父类的成员变量则需要使用super关键之

    package day02; public class Person { String name="fl"; }class Car{ }class Student extends ...

  9. delphi R3下 跨进程获取DLL信息 NtQueryInformationProcess

    unit APIUnit; { GetProcessModuleHandle API Unit Ring3调用NtQueryInformationProcess实现跨进程获取DLL句柄 } inter ...

随机推荐

  1. 2018-2019-2 20165312《网络对抗技术》Exp9 Web安全基础

    2018-2019-2 20165312<网络对抗技术>Exp9 Web安全基础 目录 Exp9_1安装Webgoat Exp9_2 SQL注入攻击 Numeric SQL Injecti ...

  2. 切换node版本,node-sass安装报错

    一.问题 经常在开发过程中,会遇到切换node环境的情况,这时候切换之后,npm安装不了node-sass,有可能是之前把node-sass安装地址修改了,导致翻墙翻不了,所以安装不了. 二.解决 1 ...

  3. Outlook 邮箱脱机工作解决方法

    在运维过程中,有时候会收到用户这样的抱怨:为什么别人发给我的邮件我都收不到,我的邮件也发不出去了? Outlook 2016图标上显示着一个红叉... 这种情况有时候是因为Outlook正在脱机工作, ...

  4. Ionic4.x Theming(主题) 增加内置主题 颜色 修改内置组件默认样式 修改底部 Tabs 背景颜色以及按钮颜色

    1.Ionic4.x Theming(主题) Ionic4.x 修改主题颜色的话需要在 src/theme/variables.scss 文件中修改. https://ionicframework.c ...

  5. Unix/Linux系统下获得时间戳函数

    在Unix/Linux系统下,使用gettimeofday函数来获得当前系统的时间戳,精度可达到微秒(microsecond,即μs)级别. 通过结构体timeval来存放当前时间戳的信息: #ifn ...

  6. connections java.net.BindException: Address already in use_解决方案

    一.问题描述 在Linux服务器(CentOS7系统)中配置并启动JMeter远程监控服务器资源所需的ServerAgent目录下的 startAgent.sh 文件时,系统出现异常提示,如 [roo ...

  7. 起步 - 安装 Git

    安装 Git 是时候动手尝试下 Git 了,不过得先安装好它.有许多种安装方式,主要分为两种,一种是通过编译源代码来安装:另一种是使用为特定平台预编译好的安装包. 从源代码安装 若是条件允许,从源代码 ...

  8. 创建IDOC

    第一步:WE31 创建IDOC所包含的字段. 第二步:WE30 创建IDOC 把Segment分配给IDOC 第三步:WE81 创建信息类型 第四步:WE82 把IDOC类型与信息类型对应. 第五步: ...

  9. ABAP编辑器输入中文变成问号

    在ABAP编辑器里输入汉字,点击空格后显示问号? 中英文环境下编辑都出现乱码 实用程序->设置 ->基于文本的编辑器 如果用老式编辑器,可以输入中文  试试打个补丁 GUI740 补丁17 ...

  10. notepad++(NPP)更换主题颜色

    NPP主题网站:https://lonewolfonline.net/notepad-colour-schemes/ 笔者下载了Nord Notepad++ Theme 然后打开%AppData%\N ...