使用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 ...
随机推荐
- 网站定时任务IIS配置
网站中的定时任务一般是必不可少的,具体的实现方法此文不做详细说明,如有需要了解的请留言.本文主要讲述定时任务有关IIS中的设置. 如果一个网站在20分钟内(IIS默认为20分钟)没有客户端访问,服务器 ...
- 解析式/推导式, 生成器 datetime 内建函数
列表解析式(List Comprehension) 语法: [返回值 for 元素 in 可迭代对象 if 条件] 使用中括号[],内部是for循环,if条件可选. 返回一个新的列表. 列表解析式的作 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围 本章之前提到过. ...
- Redis之最大内存置换策略
0.前言 Redis默认最大内存大小是应用程序可访问的内存大小, 32位windows下是2GB, linux下是3GB. 64位下可以访问的内存为2^64字节, Redis提供了maxmemory字 ...
- 如何將 MySQL 資料庫轉移到 Microsoft SQL Server 與 Azure SQL Database
MySQL 是相當常用之資料庫伺服器,而微軟雲端服務 Microsoft Azure 上 Azure SQL Database 是一個功能強大且經濟實惠的選擇,透過本篇文章,使用 SQL Server ...
- 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)
插入排序基本思想 每次将一个待排序的记录按其keyword大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完毕为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好 ...
- spring定时任务(@Scheduled注解)cron表达式详解
cron表达式详解: 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(~) 分钟(~) 小时(~) 天(~) 月(~) 星期(~ =SUN 或 SUN,MON,TU ...
- python简单网页服务器示例
参考:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683268974 ...
- mock中测试private方法,不是mock
Method method = PowerMockito.method(CategoryController.class, "getCategory",List.class);// ...
- 华为HiAI 助力苏宁易购,让你尽享完美视觉购物体验!
还在感慨商品照片与实物存在差距,又要退货? 还在抱怨被忽视的图片小细节,影响了生活品质? 想要“买买买”, 又担心海量的商品图片耗光你的流量? 就在近期 搭载HiAI能力的苏宁易购新版上线, 让你畅快 ...