【Qt之QFileInfo】使用
描述
QFileInfo
类提供了与系统无关的文件信息。
QFileInfo
提供有关文件的名称和位置(路径)在文件系统中的信息,以及它的访问权限、是否为目录或符号链接等。还可以获取文件的大小和最后修改/读取时间。QFileInfo
还可以用于获取关于Qt资源的信息。
QFileInfo
可以指向具有相对或绝对文件路径的文件。绝对文件路径以目录分隔符“/”(或在Windows上以驱动器规范开头)。相对文件名以目录名或名开头,并指定相对于当前工作目的路径。绝对路径的示例是字符串“/tmp/quartz”。相对路径可能看起来像“src/fatlib”。可以使用函数isRelative()
检查QFileInfo
是否使用对或绝对文件路径您可以调用函数makeAbsolute()
将相对QFileInfo
的路径转换为绝对路径。
QFileInfo所
操作的文件在构造函数中或以后通过set()
设置。使用exists()
来检查文件是否存在,size()
来获取文件。
可以使用isFile()
、isDir()
和isSymLink()
获取文件的类型。symLinkTarget()
函数提供了符号链接指向的文件的名称。
在Unix(括macOS和iOS)上,符号链接与指向的文件相同大小(),因为Unix透明处理符号链接;同样,使用QFile打开符号链接实际上打开了链接的目标。例如:
#ifdef Q_OS_UNIX
QFileInfo info1("/home/bob/bin/untify");
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.symLink());
info2.isSymLink(); // returns false
info2.absoluteFilePath(); // returns "/opt/pretty++/bin/untabify"
info2.size(); // returns 56201
#endif
在Windows上,符号链接(快捷方式)是.lnk文件。报告的size()是符号链接的大小(而不是链接的目标),使用QFile打开符号链接会打开.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++/abify"
QFileInfo info2(info1.symLinkTarget());
info2.isSymLink(); returns false
info2.absoluteFilePath(); // returns "CPretty++/untabify"
info2.size(); returns 63942
#endif
可以使用path()
和fileName
提取文件名的元素。可以使用baseName()
、suffix()
或completeSuffix()
提取fileName()
的各个部。由Qt类创建的FileInfo对象的目录将不具有尾部文件分隔符。如果希望在自己的文件信息对象中使用尾分隔符,只需将其附加到构造函数或setFile()
给定的文件名即可。
文件的日期由created()、lastModified()和lastRead()返回。可以使用isReadable()、isWritable()和is()获取有关文件的访问权限的信息。文件的所有权可以从owner()、ownerId、group()和groupId()中获取。可以使用permission()一次性检查文件的权限和所有权。
注意:在NTFS文件系统上,默认情况下禁用所有权和权限检查,以提高性能。要启用它,请包含以下行:
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
然后通过递增和递减qt_ntfs_permission_lookup 1次来打开和权限检查。
qtfs_permission_lookup++; // turn on
qt_ntfs_permission--; // turn it off again
常用函数及示例
-
QFileInfo::QFileInfo()
构造一个空的QFileInfo对象。 -
QFileInfo::QFileInfo(const QString &file)
构造一个新的QFileInfo,提供关于给定文件的信息。该文件还可以包括绝对或相对路径。 -
QFileInfo::QFileInfo(const QFile &file)
构造一个新的QFileInfo,提供关于文件file的信息。
文件具有相对路径QFileInfo也将具有相对路径。 -
QFileInfo::QFileInfo(const QDir &dir, const QString &file)
构造一个新的QFileInfo,提有关目录dir中定文件的信息。
如果dir具有相对路径,FileInfo也将具有相路径。
如果file是绝对路径,则会忽略指定的目录。 -
QFileInfo::QFileInfo(const Q &fileinfo)
构造一个新的QFileInfo,是给定fileinfo的本。 -
QFileInfo::~QFileInfo()
销毁QFileInfo并释放其资源。 -
QDir QFileInfo::absoluteDir() const
返回文件的绝对路径作为QDir对象。 -
QString QFileInfo::absoluteFilePath() const
返回包括文件名在内的绝对路径。
绝对路径名称由完整路径和文件名组成在Unix上,它始以根目录’/'开头的路径。在Windows上,它始终以D:/”开头,其中D是一个驱器号,但不包括未映射到驱动器的网络共享,此时路径将以“//sharename/”开头。Q将驱动器号写。请注意,QT不会这样做。下面的代码段展了这一点。
QFileInfo fi("c:/temp/foo"); => fi.absoluteFilePath() => "C:/temp/foo"
该函数与filePath()返回相同,除非isRelative为true。与canonicalFilePath()不同,符号链接或多余的“.”“…”元素不一定会被删除。
注意:如果filePath()为空此函数的行为未定义。
-
QString QFileInfo::absolutePath() const
返回文件的绝对路径,不包文件名。
在Unix上,绝对路径将始终根目录’/'头的路径。在Windows上,它始终以“D:/”开头,其中D
是驱动器号,但不包括未映射到驱动器号的网络共享,此时路径以“//sharename/”开头。
与canonicalPath() 不同,符号或多余的“.”“…”元素不一定会被删除。
警告:如果filePath()为空,则此函数的行为未定义。 -
QString QFileInfo::baseName() const
返回文件基本名称,不包括路径。
基本名称文件中的所有字符组,直到(但不包括)第一个“.”字符。
例如:
QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.baseName(); // base = "archive"
文件的基本名称在所有平台上计算方式相同,文件命名约定无关(例如,在Unix上,“.bashrc”的基本名称为空,后缀是“rc”)。
QString QFileInfo::bundleName const
返回bundle的名称。
在macOS和iOS上,如果路径是Bundle,则返回Bundle的正确本地化名称。在所有平台上,返回空的QString。
示例:
QFileInfo fi("/Applications/Safari.app");
QString bundle = fi.bundleName(); // name = "Safari"
-
bool QFileInfo::caching() const
如果启用了缓存,则返回true;否则返回false。 -
QString QFileInfo::canonicalFilePath() const
返回包括文件名的规范路径,即没有符号或冗余的"."或…"元素的绝对路径。
如果文件不存在,canonicalFilePath()返回一个空字符串。 -
QString QFileInfo::canonicalPath() const
返回文件的规范路径(不包括文件名即没有符号链接或冗余的".“或”…"元素的绝对路径如果文件不存在,canonicalPath()返回一个空字符串。 -
QString QFileInfo::completeBaseName() const
返回不带路径的文件的完整基本名称。
完整的基本名称由中最后一个’.'字符之前的所有字符组成。
示例:
QFileInfo fi("/tmp/archive.tar.gz");
QString base = fi.completeBaseName(); // base = "archive.tar"
QString QFileInfo::completeSuffix() const
返回文件的完整后缀(扩展名)。
完整扩展名由文件中第一个’.'之后的所有字符组成。
示例:
QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.completeSuffix(); // ext = "tar.gz"
-
QDateTime QFileInfo::created() const
文件创建的日期和本地时间。
在大多数Unix系统上,该函数返回最后一次状态更改的时间状态更改发生在文件创建时,但也会在用户写入或设置inode信息时发生(例如,更改文件权限)。
既不可用创建时间不可用“最一次状态更改”时间,则返回与lastModified()同的时间。 -
QDir QFileInfo::dir() const
以Dir对象的形式返回对象的父目录路径。
注意:返回的QDir始终对应于对象的父目录,即使QFileInfo表示一个目录。
对于以下每个示例,dir()将返回Dir"~/examples/697"。
QFileInfo fileInfo1("~/examples/191697.");
QFileInfo fileInfo2("~/examples/191697/");
QFileInfo fileInfo3("~/examples/191697/main.cpp");
对于以下每个示例,dir()将返回Dir"."。
QFileInfo fileInfo4(".");
Q fileInfo5("..");
QFileInfo fileInfo6("main.cpp");
-
bool QFileInfo::exists() const
如果文件存在,则返回true;否则返回false。
注意:如果是一个指向不存在文件的符号链接,则返回false -
[statis] bool QFileInfo::exists(const QString &file)
如果文件存在,则返回true;否则返回false。
注意:如果file是一个指不存在文件的符号链接返回false。
注意:与使用QFileInfo(file).exists()进行文件系统访问相比,使用此函数更快速。 -
QString QFileInfo::fileName() const
返回文件的,不包括路径。
示例:
QFileInfo fi("/tmp/archive.tar.gz");
QString name = fi.fileName(); // 名称为"archive.tar.gz"
注意,如果这个QFileInfo对象给出斜杠结尾的路径文件的名称被认是空的。
-
QString QFileInfo::filePath() const
返回包括路径文件名(可以是绝对或相对的)。 -
QString QFileInfo::group() const
返回文件所属的组。在Windows上,以及文件没有组的上,或者出现错误时,返回空字符串。
在Unix系统上,这个函数可能需要一些时间(几毫秒级)。 -
uint QFileInfo::groupId() const
返回文件所的组的ID。
对于没有组的系统和Windows系统,该函数总是返回(uint)-2。 -
bool QFileInfo::isAbsolute() const
如果文件路径名是绝对的,则返回true,否则如果路径是相对的则返回false。 -
bool QFileInfo::isBundle() const
如果此对象指向macOS和iOS上的一个bundle或bundle的符号链接,则返回true;否则返回false。 -
bool QFileInfo::isDir() const
如果此对象指向一个目录或目录的符号链接,则返回true;否则返回false。 -
bool QFileInfo::isExecutable() const
如果文件可执行,则返回true否则返回false。 -
bool QFileInfo::isFile() const
如果此对象指向一个文件或文件的符号链接,则返回true。如果对象指向不是文件的东西,比如一个目录,则返回false。 -
bool QFileInfo::isHidden() const
如果这是一个“隐藏”文件,则返回true;否则返回false。
注意:这个函数在Unix上对于特殊的条目“.”和“…”也返回,尽管QDir::List对待它们不是这样。 -
bool QFileInfo::isNativePath() const
如果文件路径可以直接在本机API使用,则返回true。如果文件由Qt内部的虚拟文件系统支持,例如Qt资源系统,则返回false。
注意:根据平台和本机API的输入要求,本机路径可能仍然需要转换分隔符和字符编码。 -
bool QFileInfo::isReadable() const
如果用户可以读取该文件,则返回true;否则返回false。
注意:如果未启用NTFS权限检查,在Windows上的结果仅反映文件是否存在。 -
bool QFileInfo::isRelative() const
如果文件路径名是相对的,则返回true;否则false(例如,在Unix上,如果路径以“/”开头,则是绝对路径)。 -
bool QFileInfo::isRoot() const
如果该对象指向一个目录或目录的符号链接,并且该目录是根目录,则返回true;否则返回false。 -
bool QFileInfo::isSymLink() const
如果此对象指向一个符号链接,则返回true;否则返回false。符号链接存在于Unix(包括macOS和iOS和Windows上,并且通常由ln -s 或者 mklink命令创建。打开符号链接实际上是打开链接目标。
此外,在上,对于快捷方式(*.lnk文件),也将返回true。打开它们将打开.lnk文件本身。
示:
QFileInfo info(fileName);
if (info.isSymLink())
fileName = info.symLinkTarget();
注意:如果号链接指向一个不存在文件,则exists()返回false。
-
bool QFileInfo::isWritable() const
如果用户可以写入文件,则返回true;否则返回false。
注意:如果未启用NTFS权限检查,则在Windows上的结果将只反映文件是否标记为只读。 -
QDateTime QFileInfo::lastModified() const
返回文件上次修改的日期和本地时间。 -
QDateTime QFileInfo::lastRead() const
返回文件上次读取(访问)的日期和本地时间。
在不支持此信息的平台上,返回与lastModified()相同的结果。 -
bool QFileInfo::makeAbsolute()
如果文件的路径不是绝对路径,则将其转换为绝对路径。返回true表示路径已经转换;否则返回false表示路径已经是绝对路径。 -
QString QFileInfo::owner() const
返回文件的所有者。在没有所有者的文件系统或发生错误时,返回空字符串。
在Unix下,此函数可能需要时间(大约几毫秒)。在Windows下,除非启用了NTFS权限检查,否则将返回空字符串。 -
uint QFileInfo::ownerId() const
返回文件的所有者ID。
在Windows和没有文件所有者的系统上,此函数返回((uint) -2)。 -
QString QFileInfo::path() const
返回文件的路径。不包括文件名。
请注意,如果此QFileInfo对象给出以斜杠结尾的路径,则文件名被视为空,此函数将返回整个路径。 -
bool QFileInfo::permission(QFile::Permissions permissions) const
测试文件权限。permissions参数可以是QFile :: Permissions类型的多个标志的OR结果,以检查权限组合。
在没有文件权限的系统上,此函数始终返回true。
注意:如果未启用NTFS权限检查,在Windows上的结果可能不准确。
示例:
QFileInfo fi("/tmp/archive.tar.gz");
if (fi.permission(QFile::WriteUser | QFile::ReadGroup))
qWarning("I can change the file; my group can read the file");
if (fi.permission(QFile::WriteGroup | QFile::WriteOther))
qWarning("The group or others can change the file");
-
QFile :: Permissions QFileInfo::permissions() const
返回文件的完整OR-ed组合QFile :: Permissions。
注意:如果未启用NTFS权限检查,在Windows上的结果可能不准确。 -
void QFileInfo::refresh()
刷新文件的信息,即在下次获取缓存属性时从文件系统中读取信息。 -
void QFileInfo::setCaching(bool enable)
如果enable为true,则启用文件信息的缓存。如果enable为false,则禁用缓存。
当启用缓存时,QFileInfo在第一次需要文件信息时从文件系统中读取文件信息,但通常不会在以后读取。
缓存默认启用。 -
void QFileInfo::setFile(const QString &file)
将QFileInfo所提供的有关文件的信息设置为file。
文件也可以包括绝对或相对文件路径。绝对路径以目录分隔符开始(例如Unix下的"/")或驱动器规范(Windows下)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。
示例:
QString absolute = "/local/bin";
QString relative = "local/bin";
QFileInfo absFile(absolute);
QFileInfo relFile(relative);
QDir::setCurrent(QDir::rootPath());
// absFile and relFile now point to the same file
QDir::setCurrent("/tmp");
// absFile now points to "/local/bin",
// while relFile points to "/tmp/local/bin"
-
void QFileInfo::setFile(const QFile &file)
这是一个重载函数。
将QFileInfo所提供的有关文件的信息设置为file。
如果file包含相对路径,QFileInfo也将具有相对路径。 -
void QFileInfo::setFile(const QDir &dir, const QString &file)
这是一个重载函数。
将QFileInfo所提供的有关文件的信息设置为目录dir中的文件。
如果file包含相对路径,QFileInfo也将具有相对路径。 -
qint64 QFileInfo::size() const
以字节为单位返回文件大小。如果文件不存在或无法获取,则返回0。 -
QString QFileInfo::suffix() const
返回文件的后缀(扩展名)。
后缀是指文件中最后一个’.'之后的所有字符。
示例:
QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.suffix(); // ext = "gz"
文件的后缀在所有平台上都是相同计算的,与文件命名约定无关(例如,在Unix上的".bashrc"具有空的基本名称,后缀为"bashrc")。
-
void QFileInfo::swap(QFileInfo &other)
将该文件信息与其他文件信息交换。此函数非常快且不会失败。 -
QString QFileInfo::symLinkTarget() const
返回符号链接指向的文件或目录的绝对路径,如果对象不是符号链接,则返回空字符串。
此名称可能不表示现有文件;它只是一个字符串。如果符号链接指向现有文件,则QFileInfo::exists()将返回true。
完整示例及结果输出
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 指定要检查的文件或目录的路径
QString path = "C:\\Users\\80943\\Desktop/test.txt.txt";
// 创建一个QFileInfo对象,并传入文件或目录的路径
QFileInfo fileInfo(path);
// 检查是否是目录
if(fileInfo.isDir()) {
qDebug() << "It's a directory.";
} else {
qDebug() << "It's not a directory.";
}
// 创建时间
qDebug() << "created: " << fileInfo.created();
// 获取基础名称
qDebug() << "Base name: " << fileInfo.baseName();
// 完整基础名称
qDebug() << "completeBaseName: " << fileInfo.completeBaseName();
// 获取文件路径
qDebug() << "File path: " << fileInfo.filePath();
// 获取绝对文件路径
qDebug() << "Absolute file path: " << fileInfo.absolutePath();
// 是否是相对路径
qDebug() << "Relative file path: " << fileInfo.isRelative();
// 获取后缀
qDebug() << "Suffix: " << fileInfo.suffix();
// 完整后缀
qDebug() << "completeSuffix: " << fileInfo.completeSuffix();
// 文本名称
qDebug() << "fileName: " << fileInfo.fileName();
// bundleName
qDebug() << "bundleName: " << fileInfo.bundleName();
// 检查文件或目录是否存在
if(fileInfo.exists()) {
qDebug() << "It exists.";
} else {
qDebug() << "It doesn't exist.";
}
// 检查是否使用了缓存
if(fileInfo.isReadable()) {
qDebug() << "It's readable.";
} else {
qDebug() << "It's not readable.";
}
return a.exec();
}
输出
应用场景
- 文件选择和打开:可以使用QFileInfo来获取选中文件的路径、名称和属性,进而打开和操作该文件。
- 文件比较:QFileInfo可以获取文件的许多属性,包括大小、修改时间等,可以用于比较两个文件是否相同或有何异同。
- 文件搜索:QFileInfo可以配合QDir一起使用,用于在特定目录或其子目录中查找文件。可以根据文件名、大小、修改时间等属性进行搜索。
- 权限管理:QFileInfo可以用于检查用户对文件的访问权限,例如判断用户是否有权读取、写入或执行该文件。
- 文件展示:可以将QFileInfo获取的文件信息展示给用户,例如在文件浏览器或资源管理器中显示文件的详细信息。
结论
愿你眼里的星星温柔泛滥
。