使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Amnes1a/article/details/65444966
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类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)的更多相关文章
- 使用QFileInfo类获取文件信息(文件的所有权和权限检查在默认情况下是被禁用的。要使能这个功能 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;)
QFileInfo类为我们提供了系统无关的文件信息,包括文件的名字和在文件系统中位置,文件的访问权限,是否是目录或符合链接,等等.并且,通过这个类,可以修改文件的大小和最后修改.读取时间.同时,QFi ...
- Android之使用MediaMetadataRetriever类获取媒体信息
一.昨天.介绍了使用MediaMetadataRetriever类来获取视频第一帧:http://blog.csdn.net/u012561176/article/details/47858099,今 ...
- Sql Server优化之索引提示----我们为什么需要查询提示,Sql Server默认情况下优化策略选择的不足
环境: Sql Server2012 SP3企业版,Windows Server2008 标准版 问题由来: 最近在做DB优化的时候,发现一个存储过程有非常严重的性能问题, 由于整个SP整体逻辑是一个 ...
- target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件
target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件
- Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息
由于我的应用在获取到经纬度后在Android8.0不能使用如下代码获取位置信息.只好使用百度地图 WEB服务API 通过调接口的方式获取位置信息. Geocoder geocoder = new Ge ...
- 解决Cornerstone不能上传.a文件的问题 Cornerstone不上传*.xcuserstate,*.xcbkptlist文件
在使用CornerStone的时候经常会出现.a文件无法上传的问题,导致从svn checkout到本地的时候编译报错 这里可以通过配置CornerStone来达到上传.a文件的效果 操作步骤: 打开 ...
- ignore-on-commit svn 更改文件后 默认不提交文件到服务器(服务器上已存在的文件)
不用那个忽略文件那个,那个功能是删除服务器的文件,然后本地还存在,不符合我的要求 我的要求是 服务器文件在,我不动,然后我改完了,和别人的不冲突,我也不覆盖别人的文件 主要就是默认不提交,这个很重要 ...
- 【转载】钉钉开发c#帮助类 获取用户信息 DingHelper.cs
using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...
- 钉钉开发c#帮助类 获取用户信息 DingHelper.cs
using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...
随机推荐
- Java基础知识介绍
数组的定义及初始化方式 数组对象创建没有() 一维数组 静态初始化: String[] books = {"Thinking in Java","Effective Ja ...
- C语言学习笔记(二) 基础知识
数据类型 C语言数据可以分为两大类: 基本类型数据和复合类型数据: 基本类型数据 整数 整型 (int) ——占4字节 短整型(short int) ——占2字节 长整型(long in ...
- VmWare下安装CentOS6
为什么选择CentOS ? 1. 主流: 目前的Linux操作系统主要应用于生产环境,主流企业级Linux系统仍旧是RedHat或者CentOS 2. 免费: RedHat 和CentOS差别不大,C ...
- Atitit.python web环境的配置 attilax 总结
Atitit.python web环境的配置 attilax 总结 1. 下载modpython/1 1.1. 安装python2.5.11 1.2. 安装modpython1 2. 设置py文件的u ...
- 11.static(转)
本文转自:http://blog.csdn.net/keyeagle/article/details/6708077 google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇 ...
- 美团HD(8)-利用NSPredicate匹配搜索结果
监听文本框改变: DJSelectCityViewController.m /** 当searchBar内的文字发生改变时调用此方法 */ - (void)searchBar:(UISearchBar ...
- Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全
Vi简介 Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序. Vi不是排版程序,只是一个纯粹的文本编辑程序. Vi是全屏幕文本编辑器,它没有菜单,只有命令. Vi不是基于窗口的,所以, ...
- Spring+SpringMVC+MyBatis+Maven框架整合
本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...
- Math函数的"四舍五入",Floor,Ceiling,Round的一些注意事项!
1.Math.Round:四舍六入五取偶 引用内容 Math.Round(0.0) //0Math.Round(0.1) //0Math.Round(0.2) //0Math.Round(0.3) / ...
- python之斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数 这样的一个数列:0,1,1,2,3,8,13,21,34…….. 特别指出:0不是第一项,而是第零项. 在数学上被以 递归的方法定 ...