使用QFileInfo类获取文件信息(文件的所有权和权限检查在默认情况下是被禁用的。要使能这个功能 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;)
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;)的更多相关文章
- 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...
- Android之使用MediaMetadataRetriever类获取媒体信息
一.昨天.介绍了使用MediaMetadataRetriever类来获取视频第一帧:http://blog.csdn.net/u012561176/article/details/47858099,今 ...
- target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件
target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件
- Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息
由于我的应用在获取到经纬度后在Android8.0不能使用如下代码获取位置信息.只好使用百度地图 WEB服务API 通过调接口的方式获取位置信息. Geocoder geocoder = new Ge ...
- 【转载】钉钉开发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 ...
- ASP.NET Webform或者ASP.NET MVC站点部署到IIS下,默认情况下.json文件是不能被访问的,如果请求访问.json文件,则会出现找不到文件的404错误提示
解决方法 <system.webServer> <staticContent> <remove fileExtension=".woff" /> ...
- 继承时,当父子类都具有相同的成员变量,默认情况下是直接调用子类的成员变量,当要调用父类的成员变量则需要使用super关键之
package day02; public class Person { String name="fl"; }class Car{ }class Student extends ...
- delphi R3下 跨进程获取DLL信息 NtQueryInformationProcess
unit APIUnit; { GetProcessModuleHandle API Unit Ring3调用NtQueryInformationProcess实现跨进程获取DLL句柄 } inter ...
随机推荐
- flask上下文流程面试总结
- 更换镜像加快python pip 安装扩展库的速度
一些镜像源: 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科 ...
- arcgis python 布局中所有元素平移
# Author: ESRI # Date: July 5, 2010 # Version: ArcGIS 10.0 # Purpose: This script will loop through ...
- 软件:IIS上配置CGI
本文的内容是:在Windows7中的IIS6.1中配置CGI功能. 我先讲步骤,步骤全用图来说明,以方便技术还是不熟练的朋友,以下是在Windows7系统来完成的. 目录 一.安装IIS步骤: 0X0 ...
- 使用oid2name列出数据库和对应的oid
[postgres@postgre base]$ ll total 172 drwx------ 2 postgres postgres 12288 Dec 6 09:21 1 drwx------ ...
- jquery页面滚动到指定id
//jquery页面滚动到指定id $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html ...
- NetHogs监控Linux的每个进程流量
在日常运维环境中,我们肯定会遇到以下这种需求: 1.网络流量异常,不知道是哪个程序的流量爆涨? 2.日常需要监控网络实时的流量进去数据 面试装逼系列|这篇文章,让运维监控不再成为你的短板! 学会这 1 ...
- python 日期计算
from datetime import timedelta,datetime import time tdy = datetime.today() tdy = tdy.strftime(" ...
- java通过telnet远程至windows机器执行dos命令
准备工作,远程windows机器中开启telnet服务,将远程登录用户添加至telnetClients用户组 核心代码: import java.io.IOException; import java ...
- python基础之坑爹正则表达式
python基础之坑爹正则表达式 概述 re模块就是python语言中的正则表达式,拆出来单独写一条blog是因为正则表达式本身就是比较庞大的知识,写具体些让自己以后方便查找. IP: ^(25[0- ...