当前位置: 首页 > article >正文

Qt开发:QFileInfo详解

文章目录

    • 一、QFileInfo 简介
    • 二、常用的构造函数
    • 三、常用函数的介绍和使用
    • 四、常用静态函数的介绍和使用
    • 五、完整代码示例

一、QFileInfo 简介

QFileInfo 提供了一个对象化的方式,用于访问文件系统中单个文件的信息。它可以接受:

  • 文件名字符串(绝对路径或相对路径)
  • QDir + QString 组合
  • QFile 对象等

二、常用的构造函数

2.1 QFileInfo::QFileInfo(const QFileInfo &fileinfo)
拷贝构造函数遵循 Qt 的值语义设计 —— 就像 QString 一样,可以安全地拷贝、赋值,而不会带来资源管理的麻烦。

使用场景
复制一个已有的 QFileInfo 以传递或临时修改:

QFileInfo original("C:/data/report.txt");
QFileInfo copy(original);// 两者指向同一个文件,但是不同的对象
qDebug() << copy.fileName();  // 输出: "report.txt"

在函数中作为参数传递(值传递或引用传递):

void printFileInfo(QFileInfo fi) {qDebug() << "Path:" << fi.absoluteFilePath();
}

或者更推荐(避免不必要的拷贝):

void printFileInfo(const QFileInfo &fi) {qDebug() << "Path:" << fi.absoluteFilePath();
}

在容器中存储多个文件信息:

QList<QFileInfo> fileList;
fileList << QFileInfo("a.txt") << QFileInfo("b.txt");for (const QFileInfo &fi : fileList) {qDebug() << fi.fileName();
}

2.2 QFileInfo::QFileInfo(const QDir &dir, const QString &file)

参数说明

  • dir:一个 QDir 对象,表示某个目录;
  • file:目录下的文件名或相对路径。

这个构造函数会自动组合 dir.absolutePath() 和 file,构造出一个完整路径下的 QFileInfo 对象。

使用场景
在目录中访问文件:

QDir dir("C:/MyFolder");
QFileInfo info(dir, "data.txt");qDebug() << "绝对路径:" << info.absoluteFilePath();
qDebug() << "是否存在:" << info.exists();

遍历文件夹时更灵活:

QDir dir("C:/Logs");
QStringList fileNames = dir.entryList(QDir::Files);for (const QString &name : fileNames) {QFileInfo info(dir, name);qDebug() << "文件:" << info.fileName()<< "大小:" << info.size()<< "最后修改:" << info.lastModified().toString();
}

这个方式比 QFileInfo(“C:/Logs/” + name) 更可靠,因为它会自动处理路径分隔符和相对路径问题。

判断某个目录中的某个相对路径是否存在:

QDir dir("D:/Projects");
QFileInfo info(dir, "subdir/readme.md");if (info.exists()) {qDebug() << "文件存在,完整路径是:" << info.absoluteFilePath();
}

2.3 QFileInfo::QFileInfo(const QFile &file)

参数说明

  • file:一个已经构造好的 QFile 对象(不需要已打开,但需要设置了文件路径)。

使用场景
这个构造方式适合以下情况:

  • 已经创建了一个 QFile 对象(可能还要进行读写),并想获取它的元信息。
  • 在同一个地方复用 QFile + QFileInfo,代码更整洁。

示例代码:

QFile file("C:/data/report.txt");
QFileInfo fileInfo(file);qDebug() << "文件名:" << fileInfo.fileName();
qDebug() << "完整路径:" << fileInfo.absoluteFilePath();
qDebug() << "文件大小:" << fileInfo.size();
qDebug() << "最后修改时间:" << fileInfo.lastModified().toString();

使用 QFile 打开文件并用 QFileInfo 获取属性

QFile file("example.txt");if (file.open(QIODevice::ReadOnly)) {QByteArray content = file.readAll();file.close();QFileInfo info(file);qDebug() << "文件大小:" << info.size();qDebug() << "文件扩展名:" << info.suffix();
}

2.4 QFileInfo::QFileInfo(const QString &file)

参数说明

  • file:文件路径字符串,可以是:绝对路径,例如 “C:/data/file.txt”;相对路径,例如 “docs/readme.md”。

作用:通过传入一个文件路径,创建一个 QFileInfo 对象,从而访问该文件的各种信息:是否存在、名称、大小、扩展名、路径、时间戳等。

示例代码:

QFileInfo info("C:/Projects/example.txt");if (info.exists()) {qDebug() << "文件名:" << info.fileName();               // "example.txt"qDebug() << "绝对路径:" << info.absoluteFilePath();     // "C:/Projects/example.txt"qDebug() << "大小:" << info.size() << "字节";           // 如:1024qDebug() << "扩展名:" << info.suffix();                 // "txt"qDebug() << "创建时间:" << info.created().toString();   // 2025-04-14 12:30:00
} else {qDebug() << "文件不存在";
}

2.5 QFileInfo::QFileInfo()
功能说明:这是 QFileInfo 的默认构造函数,构造一个 无效的、空的 QFileInfo 对象。

常见用法
延迟设置文件路径(动态赋值):

QFileInfo info;  // 空构造
info.setFile("C:/test/data.txt");if (info.exists()) {qDebug() << "文件大小:" << info.size();
}

在循环或类中使用再赋值:

QStringList files = {"a.txt", "b.txt", "c.txt"};
QFileInfo info;for (const QString &file : files) {info.setFile(file);qDebug() << file << "大小:" << info.size();
}

什么时候用默认构造?
在这里插入图片描述

三、常用函数的介绍和使用

3.1 QDir absoluteDir() const

功能说明
QFileInfo::absoluteDir() 返回一个 QDir 对象,它表示当前文件的上级目录(以绝对路径表示)。这个函数常用于:拿到一个文件路径后,想获取它所在的目录,然后可能在该目录下继续操作其他文件。

示例代码:

QFileInfo info("C:/Projects/MyApp/config/settings.ini");QDir parentDir = info.absoluteDir();qDebug() << "文件绝对路径:" << info.absoluteFilePath();   // C:/Projects/MyApp/config/settings.ini
qDebug() << "所在目录路径:" << parentDir.absolutePath();  // C:/Projects/MyApp/config

场景举例
从文件路径中获取文件所在目录:

QString path = QFileDialog::getOpenFileName();
QFileInfo info(path);
QDir dir = info.absoluteDir();qDebug() << "你选择的文件目录是:" << dir.absolutePath();

遍历与该文件同目录下的其他文件:

QFileInfo info("D:/data/report.csv");
QDir dir = info.absoluteDir();QStringList files = dir.entryList(QDir::Files);
for (const QString &name : files) {qDebug() << "同目录下的文件:" << name;
}

3.2 QString absoluteFilePath() const

功能说明
absoluteFilePath() 返回当前文件的绝对路径,它会根据系统环境返回完整的文件路径。

  • 如果文件路径已经是绝对路径,absoluteFilePath() 会直接返回它。
  • 如果文件路径是相对路径,absoluteFilePath() 会根据当前工作目录(QDir::currentPath())将其转换为绝对路径。

示例代码:
获取绝对文件路径

QFileInfo fileInfo("docs/readme.md");qDebug() << "文件的绝对路径是:" << fileInfo.absoluteFilePath();

获取已经是绝对路径的文件

QFileInfo fileInfo("/home/user/documents/report.txt");qDebug() << "文件的绝对路径是:" << fileInfo.absoluteFilePath();

使用场景
获取文件的完整路径并用于进一步操作,比如想在程序中访问文件,获取它的绝对路径:

QFileInfo fileInfo("config/settings.ini");
if (fileInfo.exists()) {QString absolutePath = fileInfo.absoluteFilePath();// 可以进一步操作文件qDebug() << "文件的绝对路径:" << absolutePath;
}

获取相对路径的文件的绝对路径,假设收到一个相对路径,你需要将其转换为绝对路径来执行某些操作:

QFileInfo fileInfo("assets/images/logo.png");
QString absolutePath = fileInfo.absoluteFilePath();
qDebug() << "文件的绝对路径:" << absolutePath;

如果当前工作目录是 “C:/Projects”, 上面代码将返回:

文件的绝对路径: "C:/Projects/assets/images/logo.png"

3.3 QString absolutePath() const

功能说明
QFileInfo::absolutePath() 返回文件所在目录的绝对路径(不包含文件名)。
比如:文件路径是:C:/Projects/MyApp/data/config.ini;absolutePath() 返回:C:/Projects/MyApp/data

示例代码:

#include <QFileInfo>
#include <QDebug>int main()
{QFileInfo info("C:/Projects/MyApp/data/config.ini");QString path = info.absolutePath();qDebug() << "文件所在目录的绝对路径是:" << path;return 0;
}

输出:

文件所在目录的绝对路径是: "C:/Projects/MyApp/data"

相对路径时也能正确处理:

QFileInfo info("logs/output.log");
qDebug() << info.absolutePath();

假如当前工作目录是 D:/App/bin,结果为:

"D:/App/bin/logs"

搭配 QFile、QDir 使用的常见组合:

QFileInfo info("reports/2024_summary.txt");
QString dirPath = info.absolutePath();
QDir dir(dirPath);QStringList fileList = dir.entryList(QDir::Files);
for (const QString &file : fileList) {qDebug() << "同目录文件:" << file;
}

3.4 QString baseName() const

功能说明
baseName() 返回文件名中去掉路径和后缀(扩展名)之后的部分,也就是基础名称。

比如,文件路径是:

/home/user/project/report2024.pdf

那么:

QFileInfo info("/home/user/project/report2024.pdf");
qDebug() << info.baseName();  // 输出: "report2024"

示例代码:

#include <QFileInfo>
#include <QDebug>int main()
{QFileInfo info("C:/Data/backup_2024.tar.gz");qDebug() << "baseName:" << info.baseName();
}

输出:

baseName: "backup_2024"

进阶用法
生成同名日志文件:

QFileInfo info("logs/mylog.txt");
QString logName = info.baseName() + "_backup.log";
qDebug() << logName;  // 输出: "mylog_backup.log"

与 UI/文件管理配合:

QString title = QString("正在查看: %1").arg(fileInfo.baseName());
setWindowTitle(title);

3.5 bool caching() const

功能说明
QFileInfo::caching() 用于判断当前 QFileInfo 实例是否开启了内部缓存机制。默认情况下,QFileInfo 会缓存文件的信息(如大小、修改时间等),避免频繁访问磁盘,提高性能。如果你想实时获取最新的文件信息,需要手动刷新,或者关闭缓存。

示例说明:

QFileInfo info("example.txt");
qDebug() << "是否启用缓存:" << info.caching();  // 通常输出 true

相关操作
关闭缓存(实时访问文件系统):

info.setCaching(false);  // 设置为关闭缓存
info.refresh();          // 手动刷新文件信息

当设置 setCaching(false) 后,每次访问文件信息(如 size()、lastModified())时,Qt 都会重新读取实际文件状态。
适用于:文件在运行期间可能被其他程序修改,以及希望读取文件的最新状态。

示例对比:缓存 vs 实时

QFileInfo info("log.txt");
info.setCaching(false); // 禁用缓存qint64 size1 = info.size();  // 第一次读取
// ...此处 log.txt 文件被外部程序修改...
qint64 size2 = info.size();  // 立即读取最新值

如果启用了缓存(默认),第二次读取的值可能不会变,除非调用 refresh()。

3.6 QString canonicalFilePath() const

功能说明
QFileInfo::canonicalFilePath() 返回文件的真实绝对路径,也就是:

  • 符号链接(软链接)会被解析成真实路径。
  • 返回的是标准化后的绝对路径。
  • 如果文件不存在,则返回空字符串。

示例对比
假设有如下结构(在 Unix 系统上):

/home/user/
├── real_folder/
│   └── data.txt
└── symlink_folder → real_folder(符号链接)
QFileInfo info("/home/user/symlink_folder/data.txt");qDebug() << info.absoluteFilePath();   // 输出: "/home/user/symlink_folder/data.txt"
qDebug() << info.canonicalFilePath();  // 输出: "/home/user/real_folder/data.txt"

canonicalFilePath() 解析了符号链接,返回了真实文件所在路径。

使用场景

  • 想获取文件的真实位置(比如检测重复文件)
  • 处理符号链接或快捷方式(macOS/Linux 下常用)
  • 用于缓存系统、去重时判断路径是否真的相同

在 Windows 上,如果路径中包含快捷方式或符号链接(如 mklink 创建的软链接),这个方法也会尝试解析真实路径。

如果文件不存在,则返回空字符串:

QFileInfo info("not_exist_file.txt");
qDebug() << info.canonicalFilePath();  // 输出: ""

示例:判断两个路径是否指向同一个文件

QFileInfo a("/home/user/real_folder/data.txt");
QFileInfo b("/home/user/symlink_folder/data.txt");if (a.canonicalFilePath() == b.canonicalFilePath()) {qDebug() << "它们是同一个文件!";
}

3.7 QString completeBaseName() const

功能说明
默认只去掉最后一个扩展名之后的部分。

示例:

QFileInfo info("backup_2024.tar.gz");
qDebug() << "baseName:" << info.baseName();             // "backup_2024"
qDebug() << "completeBaseName:" << info.completeBaseName(); // "backup_2024.tar"

3.8 QString completeSuffix() const

功能说明
会返回文件名中最后一个点 . 之后的所有内容,也就是完整的扩展名,包括多重后缀。
QFileInfo::completeSuffix() 中所谓的“最后一个点”是指:从文件名中找到第一个点之后的所有部分都被认为是完整后缀,而不是字面意义上的“最后一个点”。

假设文件名如下:

QFileInfo file1("report.txt");
QFileInfo file2("archive.tar.gz");
QFileInfo file3("data.backup.meta.json");

在这里插入图片描述

示例代码:

QFileInfo info("project.final.backup.tar.gz");qDebug() << "fileName:         " << info.fileName();         
qDebug() << "suffix:           " << info.suffix();           
qDebug() << "completeSuffix:   " << info.completeSuffix();    

输出:

fileName:          "project.final.backup.tar.gz"
suffix:            "gz"
completeSuffix:    "final.backup.tar.gz"

总结
在这里插入图片描述

3.9 QDir dir() const

功能说明
QFileInfo::dir() 返回一个 QDir 对象,表示当前文件所属的目录。这个目录是指文件所在的路径部分,不包括文件名本身。
它和 absoluteDir() 的区别是:

QFileInfo info("logs/app/log.txt");QDir relativeDir = info.dir(); // 相对目录:logs/app
qDebug() << "dir:" << relativeDir.path();QDir absDir = info.absoluteDir(); // 绝对目录(全路径)
qDebug() << "absoluteDir:" << absDir.absolutePath();

输出:

dir: "logs/app"
absoluteDir: "D:/Code/Qt/QFileInfoDemo/logs/app"

3.9.1 QDateTime birthTime() const

功能说明
QFileInfo::birthTime() 用于返回文件的创建时间(也叫“出生时间”),即文件在文件系统中第一次被创建时的时间戳。
这个时间和文件的:

  • 修改时间 (lastModified())
  • 访问时间 (lastRead())

不同,它表示最原始的创建时间。

注意事项

  • birthTime() 依赖于底层文件系统和操作系统的支持。
  • 在某些平台(如 Linux 上的 ext4)中可能返回无效时间(如空值),因为有的文件系统不存储创建时间。
  • 在 Windows 和 macOS 上通常有效。

示例代码:

QFileInfo info("example.txt");QDateTime created = info.birthTime();if (created.isValid()) {qDebug() << "文件创建时间:" << created.toString("yyyy-MM-dd hh:mm:ss");
} else {qDebug() << "当前平台不支持 birthTime() 或文件无创建时间信息";
}

示例输出(Windows)

文件创建时间: "2024-10-01 14:25:30"

3.9.2 QDateTime lastModified() const

功能说明
返回文件的最后修改时间(Last Modified Time)。也就是说,上一次写入文件内容的时间,不包括读取或访问操作。这是文件时间属性中最常用、兼容性最好的一个,所有主流平台都支持(Windows、Linux、macOS)。

示例代码:

QFileInfo info("example.txt");QDateTime modified = info.lastModified();qDebug() << "文件最后修改时间:" << modified.toString("yyyy-MM-dd hh:mm:ss");

输出:

文件最后修改时间: "2024-10-11 18:30:45"

注意事项

  • 修改时间只在文件内容改变时更新,重命名不更新。
  • 返回的是本地时间(可通过 toUTC() 转为 UTC)。
  • 如果文件不存在,返回的 QDateTime 是无效的:isValid() == false

示例:判断文件是否“最近更新”

QFileInfo info("report.txt");QDateTime last = info.lastModified();
QDateTime now = QDateTime::currentDateTime();if (last.secsTo(now) < 60 * 60) {qDebug() << "文件在1小时内更新过!";
}

3.9.3 QDateTime lastRead() const

功能说明
返回文件的最后访问时间,也就是上一次被“读取”或“打开”的时间,包括:

  • 用户用记事本打开看了下。
  • 程序调用了 QFile::read()、fopen()、QTextStream 等。
  • 使用 cat、more、less 等命令查看

这个时间与文件内容是否修改无关,只要读取就会更新(前提是系统支持)。

注意事项

  • 并不是所有操作系统或文件系统都支持“读取时间”属性!Linux:默认 不更新 atime(为性能考虑,mount 时常用 noatime),而Windows/macOS:大多数情况下支持。
  • 如果不支持,会返回无效的 QDateTime(isValid() == false)

示例代码:

QFileInfo info("data.txt");QDateTime last = info.lastRead();if (last.isValid()) {qDebug() << "文件最后读取时间:" << last.toString("yyyy-MM-dd hh:mm:ss");
} else {qDebug() << "系统不支持 lastRead() 或文件不存在";
}

示例:判断一个文件是否“最近被查看”

QFileInfo info("report.pdf");
QDateTime last = info.lastRead();
QDateTime now = QDateTime::currentDateTime();if (last.isValid() && last.secsTo(now) < 60 * 10) {qDebug() << "文件在最近10分钟被访问过";
}

3.9.4 bool exists() const

功能说明
用于判断当前 QFileInfo 指向的文件或目录是否存在于文件系统中。
它会返回:

  • true → 文件/目录确实存在。
  • false → 不存在,可能是路径错误或还没创建。

该函数同时适用于文件和目录。

示例代码:

QFileInfo fileInfo("data/report.txt");if (fileInfo.exists()) {qDebug() << "文件存在,准备读取!";
} else {qDebug() << "文件不存在,请检查路径或文件名。";
}

判断目录是否存在:

QFileInfo dirInfo("logs");if (dirInfo.exists() && dirInfo.isDir()) {qDebug() << "目录存在";
}

3.9.5 QString fileName() const

举例说明:
功能说明
返回当前文件路径中最后的文件名部分,也就是去除路径后的文件名。不包含路径,也不做扩展名截断,保留原样(含后缀)。

QFileInfo info("/home/user/docs/report_2024.pdf");qDebug() << info.fileName();  // 输出: "report_2024.pdf"

3.9.6 QString filePath() const

功能说明
返回构造这个 QFileInfo 对象时传入的原始路径(原始的字符串形式),也就是文件或目录的路径 + 文件名,不一定是绝对路径。区别在于,它不会自动转换成绝对路径,也不会解析符号链接。

示例代码:

QFileInfo info("data/report.txt");qDebug() << "filePath:" << info.filePath();             // "data/report.txt"
qDebug() << "absoluteFilePath:" << info.absoluteFilePath(); // "/home/user/project/data/report.txt"

注意事项

  • 如果你传入的是相对路径,filePath() 返回的仍是相对路径。
  • 如果想要做系统层的访问,请优先用 absoluteFilePath() 或 canonicalFilePath()。

3.9.7 QDateTime fileTime(QFile::FileTime time) const

功能说明
fileTime() 是 QFileInfo 提供的一个通用接口,可以传入一个枚举值 QFile::FileTime,它会返回对应的时间。这比分别调用 lastModified()、lastRead()、birthTime() 更加统一和灵活。

可选参数枚举
在这里插入图片描述
示例代码:

QFileInfo info("example.txt");qDebug() << "创建时间:" << info.fileTime(QFile::BirthTime).toString();
qDebug() << "修改时间:" << info.fileTime(QFile::ModificationTime).toString();
qDebug() << "访问时间:" << info.fileTime(QFile::AccessTime).toString();

3.9.10 bool isAbsolute() const

功能说明
用于判断当前文件路径是否是绝对路径。

  • 返回 true:表示该路径是绝对路径
  • 返回 false:表示该路径是相对路径

注意:这个函数判断的是传给 QFileInfo 的路径是不是绝对的,而不是文件是否真的存在。

示例代码:

QFileInfo info1("/home/user/readme.md");
QFileInfo info2("docs/report.txt");qDebug() << info1.filePath() << "是否是绝对路径?" << info1.isAbsolute();  // true
qDebug() << info2.filePath() << "是否是绝对路径?" << info2.isAbsolute();  // false

Windows 下类似:

QFileInfo info("C:\\Program Files\\Qt\\qt.conf");
qDebug() << info.isAbsolute();  // true

3.10.1 bool isDir() const

功能说明
用于判断当前 QFileInfo 对象所指的路径是否是一个存在的目录。

  • 返回 true:是一个已存在的目录
  • 返回 false:不是目录,或者目录不存在

它不仅仅判断路径形式,还会检查对应的路径在文件系统中是否存在并是目录。

示例代码:

QFileInfo fileInfo1("/home/user/Documents");
QFileInfo fileInfo2("config/settings.json");if (fileInfo1.isDir())qDebug() << "fileInfo1 是目录";
elseqDebug() << "fileInfo1 不是目录";if (!fileInfo2.isDir())qDebug() << "fileInfo2 是文件或路径不存在";

与其它函数组合使用
可以搭配 exists() 一起使用,判断路径是否为存在的目录:

QFileInfo info("backup");if (info.exists() && info.isDir()) {qDebug() << "这是一个有效目录";
} else {qDebug() << "不是有效目录";
}

3.10.2 bool isExecutable() const

功能说明
用于判断当前文件是否具有可执行权限。

  • 在 Linux/macOS:判断该文件是否有 x 权限(可执行)
  • 在 Windows:判断文件扩展名是否是 .exe、.bat、.com、.cmd 等常见可执行类型

注意:它只判断“是否 可执行”,不判断“是否 存在”,所以建议搭配 exists() 使用。

示例代码:

QFileInfo info1("/usr/bin/python3");
QFileInfo info2("setup.exe");
QFileInfo info3("README.md");qDebug() << "info1 是可执行文件?" << info1.isExecutable();  // Linux下返回 true
qDebug() << "info2 是可执行文件?" << info2.isExecutable();  // Windows下返回 true
qDebug() << "info3 是可执行文件?" << info3.isExecutable();  // 返回 false

搭配推荐

QFileInfo exeFile("tools/helper.sh");if (exeFile.exists() && exeFile.isExecutable()) {qDebug() << "可以运行的文件:" << exeFile.filePath();
} else {qDebug() << "该文件不可执行";
}

3.10.3 bool isFile() const

功能说明
用于判断当前 QFileInfo 对象所代表的路径是否是一个存在的常规文件(不是目录,不是符号链接指向目录,不是设备文件等)。

  • 返回 true:路径存在,且是一个普通文件(如 .txt, .jpg, .exe 等)
  • 返回 false:不存在,或不是文件(例如是目录)

它不仅判断路径格式,还要实际存在且是文件才返回 true。

示例代码:

QFileInfo fileInfo1("example.txt");
QFileInfo fileInfo2("logs/");
QFileInfo fileInfo3("not_exist.txt");qDebug() << "fileInfo1 是文件?" << fileInfo1.isFile();  // 取决于是否存在
qDebug() << "fileInfo2 是文件?" << fileInfo2.isFile();  // false,如果是目录
qDebug() << "fileInfo3 是文件?" << fileInfo3.isFile();  // false,如果不存在

搭配推荐使用

QFileInfo info("config/settings.ini");if (info.exists()) {if (info.isFile()) {qDebug() << "这是一个普通文件";} else {qDebug() << "路径存在,但不是文件";}
} else {qDebug() << "文件不存在";
}

3.10.4 bool isHidden() const

功能说明
判断当前路径是否是一个隐藏文件或目录。

  • 在 Windows:是否设置了“隐藏”属性(Hidden attribute)
  • 在 Unix/Linux/macOS:是否以点号 . 开头(例如 .git, .bashrc)

这个方法适用于文件和目录。

示例代码:

QFileInfo fileInfo1(".gitignore");   // Unix系统上是隐藏文件
QFileInfo fileInfo2("normal.txt");   // 普通文件
QFileInfo fileInfo3(".config/");     // 隐藏目录(Unix)qDebug() << "fileInfo1 是隐藏的?" << fileInfo1.isHidden();  // true
qDebug() << "fileInfo2 是隐藏的?" << fileInfo2.isHidden();  // false
qDebug() << "fileInfo3 是隐藏的?" << fileInfo3.isHidden();  // true

搭配使用示例

QFileInfo info("C:/Users/YourName/AppData");if (info.exists() && info.isDir()) {if (info.isHidden()) {qDebug() << "该目录是隐藏的";} else {qDebug() << "这是一个可见目录";}
}

注意事项
Windows 下 .gitignore 不会被视为隐藏,除非文件属性被设置为“隐藏”。

3.10.5 bool isNativePath() const

功能说明
用于判断当前路径是否是一个平台原生路径格式。

  • 返回 true:路径使用的是当前操作系统原生格式(例如 C:\Windows 或 /usr/bin)
  • 返回 false:路径是URL 风格或非本地格式(如 file:///C:/Windows)

举例:
在这里插入图片描述
示例代码:

QFileInfo nativeInfo("C:/Windows/System32");
QFileInfo urlInfo("file:///C:/Windows/System32");
QFileInfo qrcInfo("qrc:/images/icon.png");qDebug() << nativeInfo.isNativePath();  // true
qDebug() << urlInfo.isNativePath();     // false
qDebug() << qrcInfo.isNativePath();     // false

注意事项

  • 不判断路径是否存在,它只看路径的格式
  • 对于使用 QFileDialog 选择的文件,一般都是 native 路径
  • 如果通过 QUrl::toLocalFile() 处理后再构造 QFileInfo,结果也会是 native

3.10.6 bool isReadable() const

功能说明
判断当前路径所代表的文件或目录是否具有可读权限(对当前用户/进程)。

  • 返回 true:当前用户有读取权限
  • 返回 false:没有读取权限、文件不存在、或者不是有效路径

判断的是操作系统层面的权限,而不是逻辑状态。

示例代码:

QFileInfo fileInfo("/etc/passwd");   // Linux 系统的公共配置文件
QFileInfo fileInfo2("/root/secret.txt"); // 普通用户通常无法读取qDebug() << fileInfo.isReadable();   // true
qDebug() << fileInfo2.isReadable();  // false(除非你是 root)

搭配推荐

QFileInfo info("user_config.ini");if (!info.exists()) {qDebug() << "文件不存在";
} else if (!info.isReadable()) {qDebug() << "文件存在,但不可读";
} else {qDebug() << "文件存在且可读";
}

注意事项
在这里插入图片描述
3.10.7 bool isRelative() const

功能说明
用于判断当前路径是否是相对路径。

  • 返回 true:表示路径是相对的(例如:“images/icon.png”、“./data”)
  • 返回 false:表示路径是绝对路径(例如:“C:/Program Files” 或 “/usr/bin”)

注意:这个函数不关心路径是否存在,仅判断路径格式。

判断规则(平台相关):
在这里插入图片描述
示例代码:

QFileInfo info1("test.txt");
QFileInfo info2("C:/Windows/System32");
QFileInfo info3("/usr/local/bin");
QFileInfo info4("./data/file.txt");qDebug() << info1.filePath() << "是相对路径吗?" << info1.isRelative(); // true
qDebug() << info2.filePath() << "是相对路径吗?" << info2.isRelative(); // false
qDebug() << info3.filePath() << "是相对路径吗?" << info3.isRelative(); // false
qDebug() << info4.filePath() << "是相对路径吗?" << info4.isRelative(); // true

搭配使用建议:

QFileInfo fileInfo("./config/settings.ini");if (fileInfo.isRelative()) {QString absPath = fileInfo.absoluteFilePath();qDebug() << "这是相对路径,已转为绝对路径:" << absPath;
} else {qDebug() << "这是一个绝对路径:" << fileInfo.filePath();
}

3.10.8 bool isRoot() const

功能说明
用于判断当前路径是否是文件系统的根目录。

  • 返回 true:如果该路径是根目录(如 C:/、/)
  • 返回 false:不是根目录(如 C:/Users、/home/user)

它适用于 Windows、Linux、macOS 等平台:
在这里插入图片描述
搭配推荐使用

QFileInfo info(QDir::currentPath());if (info.isRoot()) {qDebug() << "当前路径是根目录,无法再上移了。";
} else {QDir dir = info.dir();dir.cdUp();qDebug() << "上一级目录是:" << dir.absolutePath();
}

3.10.9 bool isWritable() const

功能说明
判断当前用户对该文件或目录是否具有写入权限。

  • 返回 true:当前用户可以写入(文件可修改或目录可写)
  • 返回 false:没有写权限、只读文件、受权限控制、目录受限等

示例代码:

QFileInfo fileInfo("output.log");if (fileInfo.exists()) {if (fileInfo.isWritable()) {qDebug() << fileInfo.fileName() << "可写 ✅";} else {qDebug() << fileInfo.fileName() << "不可写 ❌";}
} else {qDebug() << "文件不存在";
}

注意事项
在这里插入图片描述

3.10.10 void refresh()

功能说明
用于强制刷新 QFileInfo 对象内部缓存的信息,使其重新读取磁盘上的实际数据。默认情况下,QFileInfo 会缓存文件信息(如大小、权限、时间戳等),为了提高性能。而 refresh() 就是用于在文件可能已被修改或替换的情况下,手动更新这些信息。

示例代码:

QFileInfo fileInfo("example.txt");qDebug() << "文件初始大小:" << fileInfo.size();// 模拟外部修改文件
QFile file("example.txt");
if (file.open(QIODevice::Append)) {file.write("Hello Qt!\n");file.close();
}// 此时 fileInfo.size() 仍是旧值
qDebug() << "未刷新前大小:" << fileInfo.size();// 刷新缓存,再获取新值
fileInfo.refresh();
qDebug() << "刷新后大小:" << fileInfo.size();

使用场景举例:
在这里插入图片描述

注意事项
在这里插入图片描述
3.10.11 void setCaching(bool enable)

功能说明
于设置该 QFileInfo 实例是否使用内部缓存机制来存储文件信息(如是否存在、大小、权限等)。

  • enable == true(默认):启用缓存,访问快,但不会实时反映文件变化。
  • enable == false:关闭缓存,每次调用都会从磁盘重新读取文件状态,确保信息是最新的。

默认行为
QFileInfo 默认启用了缓存(caching = true),为了提升性能。但这意味着:

  • 文件被外部修改后,QFileInfo 的信息可能是过期的;
  • 必须调用 .refresh() 或 .setCaching(false) 来强制读取最新数据。

示例代码:

QFileInfo fileInfo("test.txt");// 默认启用缓存,修改后 size 可能没变
qDebug() << "默认缓存:" << fileInfo.caching();
qDebug() << "初始大小:" << fileInfo.size();// 模拟写入新内容
QFile file("test.txt");
if (file.open(QIODevice::Append)) {file.write("new line\n");file.close();
}// 强制不缓存,自动读取最新状态
fileInfo.setCaching(false);
qDebug() << "关闭缓存后大小:" << fileInfo.size();

输出:
在这里插入图片描述
常见用途
在这里插入图片描述

注意事项
在这里插入图片描述

3.10.12 void setFile(const QString &file)

功能说明
用于重新设置该 QFileInfo 对象所关联的文件路径,并更新其对应的文件信息(如是否存在、大小、权限、修改时间等)。这相当于“重新指向一个新文件”,类似于重用一个 QFileInfo 对象而不是创建一个新的。

示例代码:

QFileInfo fileInfo;fileInfo.setFile("file1.txt");
qDebug() << "file1.txt 是否存在?" << fileInfo.exists();fileInfo.setFile("file2.txt");
qDebug() << "file2.txt 是否存在?" << fileInfo.exists();

使用场景
在这里插入图片描述

注意事项
在这里插入图片描述
3.10.13 void setFile(const QFile &file)

功能说明
使用一个已有的 QFile 对象,来设置(或重设)当前 QFileInfo 实例所关联的文件。

  • 会自动从 QFile 对象中提取其路径(即 QFile::fileName())。
  • 自动更新文件信息缓存(如大小、权限、是否存在等)。
  • 可以用于复用同一个 QFileInfo 对象查看多个文件的属性。

示例代码:

QFile file("example.txt");
QFileInfo info;info.setFile(file);  // 通过 QFile 设置qDebug() << "文件名:" << info.fileName();
qDebug() << "是否存在:" << info.exists();
qDebug() << "大小:" << info.size();
qDebug() << "最后修改时间:" << info.lastModified();

上面代码中,即使你没有打开文件,只要 QFile 有路径,QFileInfo 就能读取文件系统信息。

使用场景
在这里插入图片描述

注意事项
在这里插入图片描述

3.10.14 void setFile(const QDir &dir, const QString &file)

功能说明
用一个目录 (QDir) 和一个文件名 (QString) 组合出完整路径,并设置为当前 QFileInfo 实例的目标文件。然后就可以像平常一样调用 .exists()、.size()、.lastModified() 等方法获取信息。
相当于:

QFileInfo info(dir.absoluteFilePath(file));

但用这个函数更清晰,也避免手动拼路径。

示例代码:

QDir dir("/home/user/documents");
QString fileName = "report.pdf";QFileInfo info;
info.setFile(dir, fileName);qDebug() << "完整路径:" << info.absoluteFilePath();
qDebug() << "是否存在:" << info.exists();
qDebug() << "大小:" << info.size();

输出示例:

完整路径: "/home/user/documents/report.pdf"
是否存在: true
大小: 204800

注意事项

在这里插入图片描述
3.10.15 qint64 size() const

功能说明
该函数返回与 QFileInfo 关联的文件的 字节数(大小),类型是 qint64(即 64 位整数,支持大文件)。

  • 单位是 字节 (Byte)。
  • 仅在文件存在且是常规文件(而非目录)时有意义。
  • 如果文件不存在或不是普通文件,则返回 0。

示例代码:

QFileInfo info("example.txt");if (info.exists() && info.isFile()) {qDebug() << "文件大小为:" << info.size() << "字节";
} else {qDebug() << "文件不存在或不是一个普通文件";
}

注意事项
在这里插入图片描述
3.10.16 QString suffix() const

功能说明
QFileInfo::suffix() 会返回文件名的最后一个点(.)之后的部分,也就是文件的后缀(扩展名),但不包含点号 .。

例如:
在这里插入图片描述

示例代码:

QFileInfo info1("report.docx");
QFileInfo info2("archive.tar.gz");
QFileInfo info3("README");qDebug() << "report.docx 的后缀:" << info1.suffix();  // 输出: "docx"
qDebug() << "archive.tar.gz 的后缀:" << info2.suffix();  // 输出: "gz"
qDebug() << "README 的后缀:" << info3.suffix();  // 输出: ""

使用场景
在这里插入图片描述

注意事项
在这里插入图片描述

3.10.17 void swap(QFileInfo &other)

功能说明
用于将当前 QFileInfo 对象与另一个 QFileInfo 对象中的所有内容进行高效地互换,无需临时拷贝或额外资源分配。

示例代码:

QFileInfo info1("/home/user/file1.txt");
QFileInfo info2("/home/user/file2.txt");qDebug() << "交换前:";
qDebug() << "info1:" << info1.filePath();
qDebug() << "info2:" << info2.filePath();info1.swap(info2);qDebug() << "交换后:";
qDebug() << "info1:" << info1.filePath();
qDebug() << "info2:" << info2.filePath();

输出结果:

交换前:
info1: "/home/user/file1.txt"
info2: "/home/user/file2.txt"交换后:
info1: "/home/user/file2.txt"
info2: "/home/user/file1.txt"

注意事项
在这里插入图片描述

四、常用静态函数的介绍和使用

4.1 static bool QFileInfo::exists(const QString &file)

功能说明
这个函数是 静态函数,无需先创建 QFileInfo 对象,就能直接用来判断路径是否存在。你只需要传入一个路径字符串,它会判断:

  • 这个路径是否对应于一个存在的文件或目录。
  • 返回值为 true 表示存在,false 表示不存在。

它比创建 QFileInfo(file).exists() 更简洁。

示例代码:

QString path1 = "/home/user/report.txt";
QString path2 = "C:/Windows/System32";
QString path3 = "nonexistent.file";if (QFileInfo::exists(path1)) {qDebug() << path1 << "存在";
} else {qDebug() << path1 << "不存在";
}if (QFileInfo::exists(path2)) {qDebug() << path2 << "存在";
}if (!QFileInfo::exists(path3)) {qDebug() << path3 << "不存在";
}

注意事项
在这里插入图片描述

五、完整代码示例

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QWidget>#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
#include <QPushButton>#include <QFileDialog>
#include <QDateTime>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QCheckBox>class MainWindow : public QWidget
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QWidget(parent) {this->setWindowTitle("获取文件属性");m_pLabelFileName = new QLabel("文件路径名称:", this);m_pLineEditFileName = new QLineEdit(this);m_pBtnFileName = new QPushButton("打开文件...");connect(m_pBtnFileName, &QPushButton::clicked, this, &MainWindow::getFilePathAndName);m_pLabelFileSize = new QLabel("文件容量大小:", this);m_pLineEditFileSize = new QLineEdit(this);m_pLabelFileCreateTime = new QLabel("文件创建时间:", this);m_pLineEditFileCreateTime = new QLineEdit(this);m_pLabelFileModifyTime = new QLabel("文件修改时间:", this);m_pLineEditFileModifyTime = new QLineEdit(this);m_pLabelFileAccessTime = new QLabel("文件访问时间:", this);m_pLineEditFileAccessTime = new QLineEdit(this);m_pLabelFileAttribute = new QLabel("文件属性:", this);m_pCheckBoxIsFile = new QCheckBox("文件", this);m_pCheckBoxIsHide = new QCheckBox("隐藏属性", this);m_pCheckBoxIsReadAble = new QCheckBox("只读属性", this);m_pCheckBoxIsWriteAble = new QCheckBox("只写属性", this);m_pCheckBoxIsExecute = new QCheckBox("执行权限", this);m_pBtnFileAttributeInfo = new QPushButton("获取文件属性的全部数据信息", this);connect(m_pBtnFileAttributeInfo, &QPushButton::clicked, this, &MainWindow::getFileattributeInfo);QGridLayout *pGLayout = new QGridLayout();pGLayout->addWidget(m_pLabelFileName, 0, 0);pGLayout->addWidget(m_pLineEditFileName, 0, 1);pGLayout->addWidget(m_pBtnFileName, 0, 2);pGLayout->addWidget(m_pLabelFileSize, 1, 0);pGLayout->addWidget(m_pLineEditFileSize, 1, 1, 1, 2);pGLayout->addWidget(m_pLabelFileCreateTime, 2, 0);pGLayout->addWidget(m_pLineEditFileCreateTime, 2, 1, 1, 2);pGLayout->addWidget(m_pLabelFileModifyTime, 3, 0);pGLayout->addWidget(m_pLineEditFileModifyTime, 3, 1, 1, 2);pGLayout->addWidget(m_pLabelFileAccessTime, 4, 0);pGLayout->addWidget(m_pLineEditFileAccessTime, 4, 1, 1, 2);// 水平布局QHBoxLayout *pHlayout = new QHBoxLayout();pHlayout->addWidget(m_pLabelFileAttribute);pHlayout->addStretch();QHBoxLayout *pHlayoutat = new QHBoxLayout();pHlayoutat->addWidget(m_pCheckBoxIsFile);pHlayoutat->addWidget(m_pCheckBoxIsHide);pHlayoutat->addWidget(m_pCheckBoxIsReadAble);pHlayoutat->addWidget(m_pCheckBoxIsWriteAble);pHlayoutat->addWidget(m_pCheckBoxIsExecute);QHBoxLayout *pHlayoutbtn = new QHBoxLayout();pHlayoutbtn->addWidget(m_pBtnFileAttributeInfo);// 垂直布局QVBoxLayout *pVlayout = new QVBoxLayout(this);pVlayout->addLayout(pGLayout);pVlayout->addLayout(pHlayout);pVlayout->addLayout(pHlayoutat);pVlayout->addLayout(pHlayoutbtn);}private slots:void getFilePathAndName() {QString strFileNamePath;strFileNamePath = QFileDialog::getOpenFileName(this, "打开文件对话框", "/", "files(*)");m_pLineEditFileName->setText(strFileNamePath);}void getFileattributeInfo() {QString strFile = m_pLineEditFileName->text();QFileInfo fileInfo(strFile);qint64 fileSize = fileInfo.size(); //获取文件容量大小QDateTime createTime = fileInfo.birthTime(); //文件创建时间QDateTime lastModifyTime = fileInfo.lastModified(); //最后修改时间QDateTime lastAccessTime = fileInfo.lastRead(); //最后访问时间bool bFile = fileInfo.isFile();bool bHide = fileInfo.isHidden();bool bRead = fileInfo.isReadable();bool bWrite = fileInfo.isWritable();bool bExecute = fileInfo.isExecutable();m_pLineEditFileSize->setText(QString::number(fileSize));m_pLineEditFileCreateTime->setText(createTime .toString());m_pLineEditFileModifyTime->setText(lastModifyTime.toString());m_pLineEditFileAccessTime->setText(lastAccessTime.toString());m_pCheckBoxIsFile->setCheckState(bFile ? Qt::Checked : Qt::Unchecked);m_pCheckBoxIsHide->setCheckState(bHide ? Qt::Checked : Qt::Unchecked);m_pCheckBoxIsReadAble->setCheckState(bRead ? Qt::Checked : Qt::Unchecked);m_pCheckBoxIsWriteAble->setCheckState(bWrite ? Qt::Checked : Qt::Unchecked);m_pCheckBoxIsExecute->setCheckState(bExecute ? Qt::Checked : Qt::Unchecked);}private:QLabel *m_pLabelFileName;QLineEdit *m_pLineEditFileName;QPushButton *m_pBtnFileName;// 文件容量大小QLabel *m_pLabelFileSize;QLineEdit *m_pLineEditFileSize;// 文件创建时间QLabel *m_pLabelFileCreateTime;QLineEdit *m_pLineEditFileCreateTime;// 文件修改时间QLabel *m_pLabelFileModifyTime;QLineEdit *m_pLineEditFileModifyTime;// 文件访问时间QLabel *m_pLabelFileAccessTime;QLineEdit *m_pLineEditFileAccessTime;// 文件属性及复选控件QLabel *m_pLabelFileAttribute;QCheckBox *m_pCheckBoxIsFile;QCheckBox *m_pCheckBoxIsHide;QCheckBox *m_pCheckBoxIsReadAble;QCheckBox *m_pCheckBoxIsWriteAble;QCheckBox *m_pCheckBoxIsExecute;QPushButton *m_pBtnFileAttributeInfo;
};
#endif // MAINWINDOW_H

输出结果:
在这里插入图片描述

相关文章:

Qt开发:QFileInfo详解

文章目录 一、QFileInfo 简介二、常用的构造函数三、常用函数的介绍和使用四、常用静态函数的介绍和使用五、完整代码示例 一、QFileInfo 简介 QFileInfo 提供了一个对象化的方式&#xff0c;用于访问文件系统中单个文件的信息。它可以接受&#xff1a; 文件名字符串&#xff…...

ubuntu1804服务器开启ftp,局域网共享特定文件给匿名用户

要在 Ubuntu 18.04 上设置一个 FTP 服务器&#xff0c;满足以下要求&#xff1a; 允许匿名登录&#xff08;无需账号密码&#xff09;。指定分享特定目录下的文件。只允许只读下载。 可以使用 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;来实现。以下是详细步骤&a…...

蓝桥杯常考排序

1.逆序 Collections.reverseOrder() 方法对列表进行逆序排序。通过 Collections.sort() 方法配合 Collections.reverseOrder()&#xff0c;可以轻松实现从大到小的排序。 import java.util.ArrayList; // 导入 ArrayList 类&#xff0c;用于创建动态数组 import java.util.C…...

深度学习基础:从入门到理解核心概念

引言 近年来&#xff0c;深度学习(Deep Learning)已成为人工智能领域最热门的研究方向之一。从AlphaGo战胜人类围棋冠军&#xff0c;到ChatGPT等大型语言模型的惊艳表现&#xff0c;深度学习技术正在深刻改变我们的生活和工作方式。本文将系统介绍深度学习的基础知识&#xff0…...

科技项目验收测试报告有哪些作用?需要多长时间和费用?

在当今快速发展的科技环境中&#xff0c;科技项目的有效验收至关重要。对于公司、开发团队以及客户来说&#xff0c;科技项目验收测试报告更是一个不可缺少的一项重要环节。 科技项目验收测试报告是对一个项目在开发完成后所进行的一系列测试结果的总结。这份报告不仅用于证明…...

redis-事务(MULTI、EXEC、DISCARD、WATCH与lua脚本、包含lua脚本的简单介绍、乐观锁抢购案例的实现)

https://juejin.cn/post/6891158857708797959 首先Redis事务在实际的场景应用上也占着比较重要的地位&#xff0c;例如在秒杀场景中&#xff0c;我们就可以利用Redis事务中的watch命令监听key&#xff0c;实现乐观锁&#xff0c;保证不会出现冲突&#xff0c;也防止商品超卖。 …...

【Linux】su、su-、sudo、sudo -i、sudo su - 命令有什么区别?分别适用什么场景?

目录 su su- sudo sudo -i sudo su - /etc/sudoers su 该命令将启动非登录shell&#xff0c;即虽然以该用户身份启动shell&#xff0c;但使用的是原始用户的环境设置。普通用户账户运行 su 命令切换到另一用户账户&#xff0c;需提供要切换的账户的密码。root用户&…...

CCLinkIE转ModbusTCP借网关之力打破组态王与三菱PLC通讯隔阂​

在某自动化生产线项目中&#xff0c;客户采用了三菱PLC作为现场控制核心&#xff0c;该PLC支持CCLinkIE现场总线协议。同时&#xff0c;客户希望使用组态王上位机软件进行生产过程的监控与管理&#xff0c;然而组态王上位机更擅长与ModbusTCP协议设备进行通讯。为了解决这一协议…...

MyBatis-Plus 通过 ID 更新数据为NULL总结

在使用 MyBatis-Plus 通过 ID 更新数据时&#xff0c;若需将字段值设为 null&#xff0c;可参考以下解决方案&#xff1a; 方法一&#xff1a;使用 TableField 注解 在实体类字段上添加注解&#xff0c;指定更新策略为忽略非空检查&#xff1a; public class User {TableFie…...

Linux网络编程第一课:深入浅出TCP/IP协议簇与网络寻址系统

知识点1【网络发展简史】 **网络节点&#xff1a;**路由器和交换机组成 交换机的作用&#xff1a;拓展网络接口 路由&#xff1a;网络通信路径 1、分组交换 分组的目的&#xff1a; 数据量大&#xff0c;不能一次型传输&#xff0c;只能分批次传输&#xff0c;这里的每一批…...

深入解析布尔注入:原理、实战与防御

目录 一、布尔注入的原理与核心逻辑 二、布尔注入的实战步骤 三、关键函数与绕过技巧 四、实战案例&#xff1a;获取数据库名称 五、防御策略与最佳实践 六、总结 一、布尔注入的原理与核心逻辑 布尔注入&#xff08;Boolean-Based Blind SQL Injection&#xff09;是一种…...

GESP2023年12月认证C++七级( 第三部分编程题(2)纸牌游戏)

参考程序&#xff1a; #include <iostream> #include <cstring> // for memset #include <vector> using namespace std;const int max_n 1005; int n; int a[max_n], b[max_n], c[max_n]; // a[]: 得分系数&#xff1b;b[]: 换牌惩罚&#xff1b;c[]: …...

不同的人机验证的机制

目录 Cloudflare Turnstile验证 reCAPTCHA V2 GeeTest CAPTCHA Arkose Labs 验证码&#xff08;FunCaptcha&#xff09; 图像&#xff08;图片&#xff09;验证码 亚马逊验证码 (AWS/WAF) Cloudflare Turnstile验证 Cloudflare Turnstile 验证码以隐形方式运行&#xf…...

HarmonyOS学习 实验九:@State和@Prop装饰器的使用方法

HarmonyOS应用开发&#xff1a;父子组件状态管理实验报告 引言 在HarmonyOS应用开发领域&#xff0c;组件之间的状态管理是一个至关重要的概念。通过有效的状态管理&#xff0c;我们可以确保应用的数据流动清晰、可预测&#xff0c;从而提升应用的稳定性和可维护性。本次实验…...

基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册

前 言 本文主要介绍TL3562-MiniEVM评估板的AMP(Asymmetric Multi-processing)开发案例,适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:VMware16.2.5、Ubuntu20.04.6 64bit U-Boot:U-Boot-2017.09 Kernel:Linux-5.10.209 Lin…...

Java c线程等待ab线程执行完再执行

1、LockSupport AtomicInteger LockSupport.park() 函数表示挂起当前线程LockSupport.unpark© 函数表示解除线程c的阻塞状态AtomicInteger.decrementAndGet() 函数表示将该变量减一&#xff0c;并返回当前变量值&#xff08;线程安全的原子类&#xff09; 2、CountDownL…...

ubuntu20.04 Android14编译环境配置

ubuntu 更新和必要安装 sudo apt update sudo apt install git sudo apt install python2-minimal sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2 sudo upda…...

优化 Dockerfile 性能之实践(Practice of Optimizing Dockerfile Performance)

优化 Dockerfile 性能之实践 构建 Docker 镜像时&#xff0c;Dockerfile 的性能会显著影响构建过程的效率。经过优化的 Dockerfile 可以缩短构建时间、最小化镜像大小并提高整体容器性能。在本文中&#xff0c;我们将探讨优化 Dockerfile 性能的最佳实践。 尽量减少层数 影响…...

【Ai】MCP实战:手写 client 和 server [Python版本]

什么是mcp MCP 是一个开放协议&#xff0c;它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样&#xff0c;MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口…...

解决 AWS RDS MySQL mysqldump 导入sql SET @@GLOBAL 权限不足问题

在使用 mysqldump 导出数据库时&#xff0c;导出的 SQL 文件通常会包含一些 SET 语句&#xff0c;例如 SET MYSQLDUMP, SET SESSION, SET GLOBAL 等&#xff0c;这些语句用于设置会话或全局变量以确保数据一致性和兼容性。然而&#xff0c;在 AWS RDS MySQL 环境中&#xff0c;…...

Java与C在典型场景下的性能对比深度剖析

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机编程领域&#xff0c;Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…...

多智能体 AI 游戏框架(开源程序):竞争、发展、适应

一、软件介绍 文末提供程序和源码下载 SamoAI 在人类和 AI 之间创建了一个无缝的多代理叙事层&#xff0c;实现了跨多个平台的自然协作。通过一致的身份保留和情境记忆&#xff0c;它允许通过一系列行动随着时间的推移而演变的交互&#xff0c;就像人际关系一样。 二、核心概念…...

从 BI 与 SQL2API 的差异,看数据技术的多元发展路径

在数据驱动的商业世界里&#xff0c;商业智能&#xff08;BI&#xff09;与 SQL2API 如同两颗闪耀的星星&#xff0c;各自散发着独特的光芒。BI 早已在企业中广泛应用&#xff0c;成为数据分析领域的中流砥柱&#xff1b;而 SQL2API 作为新兴技术&#xff0c;虽潜力巨大&#x…...

java实现二叉树的前序、中序、后序遍历(递归和非递归方式)以及层级遍历

java实现二叉树的前序、中序、后序遍历以及层级遍历 一、二叉树节点定义二、递归方式1.前序遍历2.中序遍历3.后序遍历 三、非递归方式1.前序遍历2.中序遍历3.后序遍历4.层级遍历5.分层打印 四、测试用例 一、二叉树节点定义 class TreeNode {int val;TreeNode left;TreeNode r…...

Solr admin 更新文档

<add><doc><field name"id">1904451090351546368</field><field name"companyName" update"set">测试科技有限公司</field></doc> </add>...

【Netty篇】EventLoopGroup 与 EventLoop 详解

目录 开场白&#xff1a;话说 Netty 江湖第一段&#xff1a;EventLoopGroup——“包工头”的角色第二段&#xff1a;EventLoop——“身怀绝技的工人”第三段&#xff1a;EventLoop 如何处理 I/O 事件、普通任务和定时任务第四段&#xff1a;Handler 执行中如何换人&#xff1f;…...

操作系统之shell实现(上)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

考研数据结构之图的遍历:深度优先搜索(DFS)与广度优先搜索(BFS)(包含真题及解析)

考研数据结构之图的遍历&#xff1a;深度优先搜索&#xff08;DFS&#xff09;与广度优先搜索&#xff08;BFS&#xff09; 图的遍历是图论中的核心操作之一&#xff0c;主要包括深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;。本文将详…...

数据结构与算法——链表OJ题详解(2)

文章目录 一、前言二、OJ续享2.1相交链表2.2环形链表12.2环形链表2 三、总结 一、前言 哦了兄弟们&#xff0c;咱们上次在详解链表OJ题的时候&#xff0c;有一部分OJ题呢up并没有整理完&#xff0c;这一个星期呢&#xff0c;up也是在不断的学习并且沉淀着&#xff0c;也是终于…...

Linux 基础知识详解

Linux 基础知识详解 一、快照与克隆 1. &#x1f4f8;快照&#xff08;Snapshot&#xff09; 快照是虚拟机当前运行状态的一次“瞬间拷贝”&#xff0c;包括内存、磁盘、配置等信息。这使得管理员能够快速恢复到某个特定的时间点。 用途&#xff1a; 安全实验前保存状态&am…...