9.4 获取文件信息
9.4 获取文件信息
我们前面介绍了如何使用Qt的QDir来完成对目录的一些常用的操作,接下来我们将重心放到文件上来,在Qt中,也有用于对文件进行处理的相关的类,这个类就叫QFileInfo,这个类提供了很多与文件信息的一些操作,我们可以通过这些操作来完成项目中的一些小的需求。
案例(利用QFileInfo来获取文件信息)
(1)建立一个Qt的GUI应用程序,之后项目名称命名为FileInfo,类名命名为FileInfo,基类选择QDialog。
(2)在fileinfo.h中添加以下这些成员。完成对界面所需要的元素的基本的构成。
#ifndef FILEINFO_H
#define FILEINFO_H
#include <QDialog>
#include <QFileInfo>
#include <QFileDialog>
#include <QMessageBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QCheckBox>
#include <QDateTime>
#include <QGridLayout>
class FileInfo : public QDialog
{
Q_OBJECT
public:
FileInfo(QWidget *parent = nullptr);
~FileInfo();
private slots:
void slotOpenFile();
void slotGetFileInfo();
private:
QLabel*m_fileNameLabel;//文件名Label
QLineEdit*m_fileNameLineEdit;//文件路径
QPushButton*m_openFilePushButton;//打开文件
QLabel*m_fileSizeLabel;//文件大小Label
QLineEdit*m_fileSizeLineEdit;//文件大小
QLabel*m_createTimeLabel;//创建时间Label
QLineEdit*m_createTimeLineEdit;//创建时间
QLabel*m_lastModifyTimeLabel;//最后修改时间Label
QLineEdit*m_lastModifyTineLineEidit;//最后修改时间
QLabel*m_lastAccessTimeLabel;//最后访问时间Label
QLineEdit*m_lastAccessTimeLineEdit;//最后访问时间
QLabel*m_attributeLabel;//属性Label;
QCheckBox*m_dirCheckBox;//目录
QCheckBox*m_fileCheckBox;//文件
QCheckBox*m_symbolLink;//符号链接
QCheckBox*m_hide;//隐藏
QCheckBox*m_read;//读
QCheckBox*m_write;//写
QCheckBox*m_execute;//执行
QPushButton*m_getFileInfoPushButton;//获得文件信息按钮
private:
QGridLayout*m_mainLayout;//主布局
QHBoxLayout*m_checkBoxLayout;//复选框Layout
private:
QString m_fileName;
};
#endif // FILEINFO_H
(3)在fileinfo.cpp中添加这些成员的实现,并编写相应的获取文件信息的逻辑
#include "fileinfo.h"
FileInfo::FileInfo(QWidget *parent):QDialog(parent)
{
m_mainLayout = new QGridLayout(this);
m_checkBoxLayout = new QHBoxLayout;
m_fileNameLabel = new QLabel(QString("文件名:"));
m_fileNameLineEdit = new QLineEdit;
m_fileNameLineEdit->setReadOnly(true);
m_openFilePushButton = new QPushButton(QString("打开文件"));
m_mainLayout->addWidget(m_fileNameLabel,0,0);
m_mainLayout->addWidget(m_fileNameLineEdit,0,1);
m_mainLayout->addWidget(m_openFilePushButton,0,2);
m_fileSizeLabel = new QLabel(QString("大小:"));
m_fileSizeLineEdit = new QLineEdit;
m_fileSizeLineEdit->setReadOnly(true);
m_mainLayout->addWidget(m_fileSizeLabel,1,0);
m_mainLayout->addWidget(m_fileSizeLineEdit,1,1,1,2);
m_createTimeLabel = new QLabel(QString("创建时间:"));
m_createTimeLineEdit = new QLineEdit;
m_createTimeLineEdit->setReadOnly(true);
m_mainLayout->addWidget(m_createTimeLabel,2,0);
m_mainLayout->addWidget(m_createTimeLineEdit,2,1,1,2);
m_lastModifyTimeLabel = new QLabel(QString("最后修改时间:"));
m_lastModifyTineLineEidit = new QLineEdit;
m_lastModifyTineLineEidit->setReadOnly(true);
m_mainLayout->addWidget(m_lastModifyTimeLabel,3,0);
m_mainLayout->addWidget(m_lastModifyTineLineEidit,3,1,1,2);
m_lastAccessTimeLabel = new QLabel(QString("最后访问时间:"));
m_lastAccessTimeLineEdit = new QLineEdit;
m_lastAccessTimeLineEdit->setReadOnly(true);
m_mainLayout->addWidget(m_lastAccessTimeLabel,4,0);
m_mainLayout->addWidget(m_lastAccessTimeLineEdit,4,1,1,2);
m_attributeLabel = new QLabel(QString("属性:"));
m_mainLayout->addWidget(m_attributeLabel,5,0,1,2);
m_dirCheckBox = new QCheckBox(QString("目录"));
m_fileCheckBox = new QCheckBox(QString("文件"));
m_symbolLink = new QCheckBox(QString("符号链接"));
m_hide = new QCheckBox(QString("隐藏"));
m_read = new QCheckBox(QString("读"));
m_write = new QCheckBox(QString("写"));
m_execute = new QCheckBox(QString("执行"));
m_dirCheckBox->setDisabled(true);
m_fileCheckBox->setDisabled(true);
m_symbolLink->setDisabled(true);
m_hide->setDisabled(true);
m_read->setDisabled(true);
m_write->setDisabled(true);
m_execute->setDisabled(true);
m_checkBoxLayout->addWidget(m_dirCheckBox);
m_checkBoxLayout->addWidget(m_fileCheckBox);
m_checkBoxLayout->addWidget(m_symbolLink);
m_checkBoxLayout->addWidget(m_hide);
m_checkBoxLayout->addWidget(m_read);
m_checkBoxLayout->addWidget(m_write);
m_checkBoxLayout->addWidget(m_execute);
m_mainLayout->addLayout(m_checkBoxLayout,6,0,1,4);
m_getFileInfoPushButton = new QPushButton(QString("获取文件信息"));
m_mainLayout->addWidget(m_getFileInfoPushButton,7,0,1,4);
connect(this->m_openFilePushButton,&QPushButton::clicked,this,&FileInfo::slotOpenFile);
connect(this->m_getFileInfoPushButton,&QPushButton::clicked,this,&FileInfo::slotGetFileInfo);
}
FileInfo::~FileInfo()
{
}
void FileInfo::slotOpenFile()
{
m_fileName = QFileDialog::getOpenFileName(this,"打开文件","./");
this->m_fileNameLineEdit->setText(m_fileName);
}
void FileInfo::slotGetFileInfo()
{
if(m_fileName.isEmpty())
{
QMessageBox::warning(this,QString("提示"),QString("未选择任何文件!"));
}
else
{
QFileInfo info(m_fileName);
m_fileSizeLineEdit->setText(QString("%1 字节").arg(info.size()));
m_createTimeLineEdit->setText(info.created().toString());
m_lastModifyTineLineEidit->setText(info.lastModified().toString());
m_lastAccessTimeLineEdit->setText(info.lastRead().toString());
m_dirCheckBox->setChecked(info.isDir());
m_fileCheckBox->setChecked(info.isFile());
m_symbolLink->setChecked(info.isSymLink());
m_hide->setChecked(info.isHidden());
m_read->setChecked(info.isReadable());
m_write->setChecked(info.isWritable());
m_execute->setChecked(info.isExecutable());
m_dirCheckBox->setDisabled(true);
m_fileCheckBox->setDisabled(true);
m_symbolLink->setDisabled(true);
m_hide->setDisabled(true);
m_read->setDisabled(true);
m_write->setDisabled(true);
m_execute->setDisabled(true);
}
}
(4)运行程序

另外,在QFileInfo中还有很多的成员,以下通过一个例子做一个总结:
#include <QApplication>
#include <QDebug>
#include <QDateTime>
#include <QFileDialog>
#include <QFileInfo>
int main(int argc, char *argv[])
{
QApplication theApp(argc, argv);
QString fileName = QFileDialog::getOpenFileName(nullptr,QString("打开文件"),QString("./"));
if(fileName.isEmpty())
{
qDebug() << "未打开任何文件!";
}
else
{
//1.QFileInfo的几个构造器
/*
* QFileInfo(const QFileInfo &fileinfo)//Copy Constructor
* QFileInfo(const QDir &dir, const QString &file)//From In Any Dir File Constructor
* QFileInfo(const QFile &file) //From QFile Object Constructor
* QFileInfo(const QString &file) // From QString Constructor
* QFileInfo() //Empty Constructor
*/
QFileInfo info(fileName);
//2.QDir QFileInfo::absoluteDir() const
{
qDebug() << "----QDir QFileInfo::absoluteDir() const----";
//该函数会返回所打开的文件的绝对路径(这个路径是不包括文件名本身的哦!)
qDebug() << info.absoluteDir();
qDebug() << "----END QDir QFileInfo::absoluteDir() const----";
}
//3.QString QFileInfo::absoluteFilePath() const
{
qDebug() << "----QString QFileInfo::absoluteFilePath() const----";
//该函数会以字符串的方式返回文件所在的绝对路径(注意,这个路径包含了文件名)
qDebug() << info.absoluteFilePath();
qDebug() << "----END QString QFileInfo::absoluteFilePath() const----";
}
//4.QString QFileInfo::absolutePath() const
{
qDebug() << "----QString QFileInfo::absolutePath() const----";
//该函数会以字符串的方式返回文件所在的目录路径(不包括文件名)
qDebug() << info.absolutePath();
qDebug() << "----END QString QFileInfo::absolutePath() const----";
}
//5.QString QFileInfo::baseName() const
{
qDebug() << "----QString QFileInfo::baseName() const----";
//该函数会返回文件的文件名称,比如/usr/local/Demo.MP4,那么就会返回Demo
//假如名字叫XXX.tar.gz 那么返回的名称是XXX
qDebug() << info.baseName();
qDebug() << "----END QString QFileInfo::baseName() const----";
}
//6.QDateTime QFileInfo::birthTime() const
{
qDebug() << "----QDateTime QFileInfo::birthTime() const----";
//返回文件被初次创建的时间
qDebug() << info.birthTime().toString();
qDebug() << "----END QDateTime QFileInfo::birthTime() const----";
}
//7.QString QFileInfo::bundleName() const
{
qDebug() << "----QString QFileInfo::bundleName() const----";
//返回文件的包名称
//实际上这个包名称的概念是在MacOS系统中的软件上,我们知道,Mac系统重的Applications目录中的文件看似是一个图标,实则它是一个包,可以理解为一种特殊的文件夹,这种包文件已.app为后缀结尾
QFileInfo fileInfo("/Applications/Safari.app");
qDebug() << fileInfo.bundleName();
qDebug() << "----END QString QFileInfo::bundleName() const----";
}
//8.bool QFileInfo::caching() const
//void QFileInfo::setCaching(bool enable)
{
qDebug() << "----bool QFileInfo::caching() const;void QFileInfo::setCaching(bool enable)----";
//返回是否启用了文件的缓存信息
//设置是否要启用文件信息的缓存,这个实际上就是,如果设置为true,那么当第一次打开文件的信息时,当有其他应用程序修改了这个文件,那么QFileInfo不会对文件修改之后的信息进行刷新。默认情况下,缓存是启用的
qDebug() << "caching():" << info.caching();
info.setCaching(false);
qDebug() << "----END bool QFileInfo::caching() const;void QFileInfo::setCaching(bool enable)----";
}
//9.void QFileInfo::setFile(const QString &file)
{
qDebug() << "----void QFileInfo::setFile(const QString &file)----";
//该函数用于设置文件或目录(这里面如果直接写文件名称,那么就是相对路径,否则写绝对路径)
QFileInfo info("/bin/ls");
qDebug() << info;
info.setFile("/bin/pwd");//设置文件
qDebug() << info;
info.setFile("/bin");//还可以设置目录
qDebug() << info;
qDebug() << "----END void QFileInfo::setFile(const QString &file)----";
}
//10.QString QFileInfo::canonicalFilePath() const
//QString QFileInfo::canonicalPath() const
{
qDebug() << "----QString QFileInfo::canonicalFilePath() const----";
//返回包含了文件名的规范的文件的路径(即不包含软链接或含有.或..的路径)
//返回不包含文件名的规范的文件所在的目录
qDebug() << info.canonicalFilePath();
qDebug() << info.canonicalPath();
qDebug() << "----END QString QFileInfo::canonicalFilePath() const----";
}
//11.QString QFileInfo::completeBaseName() const
{
//该函数用于获取不包含文件所在路径的文件的全部的名称,比如/usr/bin/Demo.MP4就会返回Demo.MP4
//但如果文件名含有两个及以上的.的话,那么第二个.之后的名称会被忽略,比如XXX.tar.gz就会是XXX.tar
qDebug() << info.completeBaseName();
}
//12.QString QFileInfo::completeSuffix() const
{
//该函数会返回文件的后缀名,如果文件的后缀名叫XXX.tar.gz.kkk.mmm 那么返回的就是.tar.gz.kkk.mmm
qDebug() << info.completeSuffix();
}
//13.QDir QFileInfo::dir() const
{
//该函数会返回最顶层的目录
QFileInfo fileInfo("/usr/bin/ls");
qDebug() << fileInfo.dir();// /usr/bin
}
//14.bool QFileInfo::exists() const
//static bool QFileInfo::exists(const QString &file)
{
qDebug() << "----bool QFileInfo::exists() const;static bool QFileInfo::exists(const QString &file)----";
//该函数用于判断文件或目录是否存在(成员方法)
//静态方法来判断该命目录是否存在
QFileInfo fileInfo("/Users/admin/Desktop");
qDebug() << fileInfo.exists();
fileInfo.setFile("/UserSSS");
qDebug() << fileInfo.exists();
qDebug() << "----END bool QFileInfo::exists() const;static bool QFileInfo::exists(const QString &file)----";
}
//15.QString QFileInfo::fileName() const
{
qDebug() << "----QString QFileInfo::fileName() const----";
//该函数会返回文件的名称(包括了文件名和后缀但不包括文件就所在的路径)
qDebug() << info.fileName();
qDebug() << "----END QString QFileInfo::fileName() const----";
}
//16.QString QFileInfo::filePath() const
{
qDebug() << "----QString QFileInfo::filePath() const----";
//该函数会返回文件所在的路径[不包括文件名称](可以是绝对路径,也可以是相对路径,这取决于QFileInfo中的makeAbsolute是否被设置了)
info.makeAbsolute();
qDebug() << "绝对路径:" << info.filePath();
qDebug() << "----END QString QFileInfo::filePath() const----";
}
//17.QDateTime QFileInfo::fileTime(QFile::FileTime time) const
{
qDebug() << "----QDateTime QFileInfo::fileTime(QFile::FileTime time) const----";
//该函数会根据传入的枚举来返回枚举所描述的文件的相关的时间
qDebug() << "FileBirthTime:" << info.fileTime(QFile::FileTime::FileBirthTime).toString();
qDebug() << "FileAccessTime:" << info.fileTime(QFile::FileTime::FileAccessTime).toString();
qDebug() << "FileModificationTime:" << info.fileTime(QFile::FileTime::FileModificationTime).toString();
qDebug() << "FileMetadataChangeTime:" << info.fileTime(QFile::FileTime::FileMetadataChangeTime).toString();
qDebug() << "----END QDateTime QFileInfo::fileTime(QFile::FileTime time) const----";
/*
QFileDevice::FileAccessTime 文件最后一次被访问的时间(最后一次被读取或写入)
QFileDevice::FileBirthTime 文件的创建的日期
QFileDevice::FileMetadataChangeTime 上次更改文件元数据的时间
QFileDevice::FileModificationTime 最近一次修改文件的时间
*/
}
//18.QString QFileInfo::group() const
//uint QFileInfo::groupId() const
//QString QFileInfo::owner() const
//uint QFileInfo::ownerId() const
{
qDebug() << "----QString QFileInfo::group() const;uint QFileInfo::groupId() const;QString QFileInfo::owner() const;uint QFileInfo::ownerId() const----";
//获取文件或目录的所在组的名称
//获取文件或目录所在组的ID
//获取文件或目录的拥有者的名称
//获取文件或目录的拥有者的ID
qDebug() << "group():" << info.group();
qDebug() << "groupId():" << info.groupId();
qDebug() << "owner():" << info.owner();
qDebug() << "ownerId():" << info.ownerId();
qDebug() << "----END QString QFileInfo::group() const;uint QFileInfo::groupId() const;QString QFileInfo::owner() const;uint QFileInfo::ownerId() const----";
}
//19.bool QFileInfo::isAbsolute() const
//bool QFileInfo::isBundle() const
//bool QFileInfo::isDir() const
//bool QFileInfo::isExecutable() const
//bool QFileInfo::isFile() const
//bool QFileInfo::isHidden() const
//bool QFileInfo::isNativePath() const
//bool QFileInfo::isReadable() const
//bool QFileInfo::isRelative() const
//bool QFileInfo::isRoot() const
//bool QFileInfo::isSymLink() const
//bool QFileInfo::isWritable() const
{
qDebug() << "----File Attribute----";
//判断当前的文件或目录是否使用的是绝对路径
//判断当前的文件是否是包(这是MacOS的/Applications中的应用程序的那种包文件)
//判断当前是不是目录
//判断当前用户对的文件是否有可执行的权限
//判断当前的文件是否是文件
//判断当前的文件是否是带有隐藏属性
//判断当前的路径是否是原生的路径(因为比如Qt的资源文件,它就是一种虚拟的路径而不是原原本本的那种路径)
//判断当前用户对该文件是否有读权限
//判断当前文件或目录的路径是否是相对路径
//判断当前的路径或文件所在的路径是否是根路径
//判断当前的文件是否是软链接(快捷方式)
//判断当前用户对该目录或文件是否具有写权限
qDebug() << "isAbsolute():" << info.isAbsolute();
qDebug() << "isBundle():" << info.isBundle();
qDebug() << "isDir():" << info.isDir();
qDebug() << "isExecutable():" << info.isExecutable();
qDebug() << "isFile():" << info.isFile();
qDebug() << "isHidden():" << info.isHidden();
qDebug() << "isNativePath():" << info.isNativePath();
qDebug() << "isRelative():" << info.isRelative();
qDebug() << "isReadable():" << info.isReadable();
qDebug() << "isRoot():" << info.isRoot();
qDebug() << "isSymLink():" << info.isSymLink();
qDebug() << "isWritable():" << info.isWritable();
qDebug() << "----END File Attribute----";
}
//20.QDateTime QFileInfo::lastModified() const
//QDateTime QFileInfo::lastRead() const
//QDateTime QFileInfo::metadataChangeTime() const
//QDateTime QFileInfo::birthTime() const
{
qDebug() << "----QDateTime QFileInfo::lastModified() const;QDateTime QFileInfo::lastRead() const;QDateTime QFileInfo::metadataChangeTime() const;QDateTime QFileInfo::birthTime() const----";
//获取文件最后一次被修改的时间
//获取文件最后一次被读取的时间
//获取最近一次文件的元数据被修改的时间
//获取文件第一次被创建时的时间
qDebug() << "lastModified():" << info.lastModified().toString();
qDebug() << "lastRead():" << info.lastRead().toString();
qDebug() << "metadataChangeTime():" << info.metadataChangeTime().toString();
qDebug() << "birthTime():" << info.birthTime().toString();
qDebug() << "----END QDateTime QFileInfo::lastModified() const;QDateTime QFileInfo::lastRead() const;QDateTime QFileInfo::metadataChangeTime() const;QDateTime QFileInfo::birthTime() const----";
}
//21.bool QFileInfo::makeAbsolute()
{
qDebug() << "----bool QFileInfo::makeAbsolute()----";
//该函数是用在如果当前的路径不是绝对路径,则将该路径转换为绝对路径,并返回true。若已经是绝对路径,则返回false,则表示已经是绝对路径了。不需要再做转换
if(info.isAbsolute())
{
qDebug() << "Aready Is Absolute Path";
}
else
{
qDebug() << info.makeAbsolute();
}
qDebug() << "----END bool QFileInfo::makeAbsolute()----";
}
//22.bool QFileInfo::permission(QFile::Permissions permissions) const
{
qDebug() << "----bool QFileInfo::permission(QFile::Permissions permissions) const----";
//该函数用于测试用户对文件或目录是否有相应的权限
//可以测试以下的权限
/*
QFileDevice::ReadOwner //文件拥有者是否可读
QFileDevice::WriteOwner //文件的拥有者是否可写
QFileDevice::ExeOwner //文件的拥有者是否可执行
QFileDevice::ReadUser //文件的用户是否可读
QFileDevice::WriteUser //文件的用户是否可写
QFileDevice::ExeUser //文件的用户是否可执行
QFileDevice::ReadGroup //和用户同组的用户是否可读
QFileDevice::WriteGroup //和用户同组的用户是否可写
QFileDevice::ExeGroup //和用户同组的用户是否可执行
QFileDevice::ReadOther //其他用户是否可读
QFileDevice::WriteOther //其他用户是否可写
QFileDevice::ExeOther //其他用户是否可执行
*/
qDebug() << QString("%1%2%3%4%5%6%7%8%9").arg(info.permission(QFile::Permission::ReadOwner)?'r':'-').arg(info.permission(QFile::Permission::WriteOwner)?'w':'-').arg(info.permission(QFile::Permission::ExeOwner)?'x':'-').arg(info.permission(QFile::Permission::ReadGroup)?'r':'-').arg(info.permission(QFile::Permission::WriteGroup)?'w':'-').arg(info.permission(QFile::Permission::ExeGroup)?'x':'-').arg(info.permission(QFile::Permission::ReadOther)?'r':'-').arg(info.permission(QFile::Permission::WriteOther)?'w':'-').arg(info.permission(QFile::ExeOther)?'x':'-');
qDebug() << "----END bool QFileInfo::permission(QFile::Permissions permissions) const----";
//当然,我们还可以通过|运算符来连接多个不同的权限来进行测试
}
//23.QFile::Permissions QFileInfo::permissions() const
{
qDebug() << "----QFile::Permissions QFileInfo::permissions() const----";
//这个函数会返回一个组合过的权限,然后我们可以通过返回的结果与需要判断的权限的枚举进行&操作来得到是否有这个权限
QFile::Permissions permissons = info.permissions();
if(permissons.testFlag(QFile::Permission::ReadOwner))
{
qDebug() << "OwnerRead";
}
if(permissons&QFile::Permission::WriteOwner)
{
qDebug() << "OwnerWrite";
}
if(permissons.operator&(QFile::Permission::ExeOwner))
{
qDebug() << "OwnerExec";
}
qDebug() << "----END QFile::Permissions QFileInfo::permissions() const----";
}
//24.void QFileInfo::refresh()
{
//该函数用于刷新一次文件的信息,这经常被使用在如果文件被其他的进程所修改,你们我这个程序里面需要更新文件的信息时,就可以调用这个函数
info.refresh();
qDebug() << info;
}
//25.qint64 QFileInfo::size() const
{
//该函数会得到文件的大小
qDebug() << info.size();
}
//26.QString QFileInfo::suffix() const
{
//返回文件的后缀(不包括.并且是最后的后缀)
qDebug() << info.suffix();
}
//27.void QFileInfo::swap(QFileInfo &other)
{
//该函数用于快速交换两个文件的信息
QFileInfo fileInfo;
fileInfo.swap(info);
}
//28.QString QFileInfo::symLinkTarget() const
{
//如果文件是一个软链接,则会得到该软链接所指向的目标的路径
qDebug() << info.symLinkTarget();
}
//29.bool QFileInfo::operator==(const QFileInfo &fileinfo) const
{
//如果两个QFileInfo指向同一个文件(目录也要相同,哪怕是同一个文件在不同的目录也会返回false),否则返回true
QFileInfo info1("/bin/ls");
QFileInfo info2("/Users/admin/Desktop/ls");
qDebug() << info1.operator==(info2);
}
}
return theApp.exec();
}
本节代码:https://files.cnblogs.com/files/blogs/792763/FileInfo.zip?t=1720191408&download=true
https://files.cnblogs.com/files/blogs/792763/QFileInfoDemo.zip?t=1720209215&download=true

浙公网安备 33010602011771号