【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 
#include 
#include 
#include 
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();
}

输出

【Qt之QFileInfo】使用_第1张图片

应用场景

  1. 文件选择和打开:可以使用QFileInfo来获取选中文件的路径、名称和属性,进而打开和操作该文件。
  2. 文件比较:QFileInfo可以获取文件的许多属性,包括大小、修改时间等,可以用于比较两个文件是否相同或有何异同。
  3. 文件搜索:QFileInfo可以配合QDir一起使用,用于在特定目录或其子目录中查找文件。可以根据文件名、大小、修改时间等属性进行搜索。
  4. 权限管理:QFileInfo可以用于检查用户对文件的访问权限,例如判断用户是否有权读取、写入或执行该文件。
  5. 文件展示:可以将QFileInfo获取的文件信息展示给用户,例如在文件浏览器或资源管理器中显示文件的详细信息。

结论

愿你眼里的星星温柔泛滥

你可能感兴趣的:(Qt记录,qt,开发语言)