Qt 文件操作

ops/2024/10/22 15:38:49/

目录

  • Qt 文件操作
    • 1. I/O设备
      • 1.1 I/O设备的类型
      • 1.2 打开模式
    • 2. 文件读写
      • 2.1 QFile
        • 打开文件
        • 写文件
        • 读文件
        • 静态函数
      • 2.2 Stream
        • QTextStream
        • QDataStream
      • 2.3 QFileInfo
    • 3. 配置文件
      • 3.1 QSettings
        • 基本用法
        • 设置和获取值
        • 配置文件格式
        • 常用函数
        • 分组操作
      • 3.2 QJsonDocument
        • 主要功能
        • 解析 JSON
        • 简单的对象
        • 复杂对象
        • 数组
    • 4. 目录/路径
      • 4.1 QDir
        • 目录操作
        • 目录条目获取
        • 常用路径获取
        • 计算目录大小
      • 4.2 QDirIterator
        • 使用示例
      • 4.3 QStandardPaths
        • 静态公有函数
        • 枚举:标准位置
        • 查找文件示例
      • 4.4 QStorageInfo
        • 创建实例
        • 静态方法
        • 缓存与刷新
        • 示例代码
          • 检索系统根卷信息
          • 获取所有可用文件系统
        • 示例代码
          • 检索系统根卷信息
          • 获取所有可用文件系统

Qt 文件操作

Qt 提供了一套强大的文件操作API,使得在各种应用场景下进行文件管理变得高效而简单。无论是在桌面应用程序、嵌入式系统还是移动应用中,浏览、读取、写入和管理文件及目录都是基本而重要的任务。

以下是一些常用的 Qt 文件操作,涵盖了文件读写、配置管理以及目录和路径操作。

操作类型类名方法/功能示例代码
打开文件QFileopen()file.open(QIODevice::ReadOnly | QIODevice::Text)
读取文件QFilereadAll() / readLine()QString content = file.readAll();
写入文件QFilewrite()file.write("Hello, World!");
关闭文件QFileclose()file.close();
获取文件信息QFileInfoexists(), size(), created()QFileInfo info("example.txt"); info.size();
读取配置QSettingsvalue()QString username = settings.value("username").toString();
写入配置QSettingssetValue()settings.setValue("username", "user123");
JSON 读取QJsonDocumentfromJson()QJsonDocument doc = QJsonDocument::fromJson(data);
JSON 写入QJsonDocumenttoJson()file.write(doc.toJson());
列出目录内容QDirentryList()QStringList files = dir.entryList();
创建目录QDirmkdir()dir.mkdir("newDirectory");
迭代目录内容QDirIteratornext() / hasNext()while(it.hasNext()) { QString path = it.next(); }
获取标准路径QStandardPathswritableLocation()QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
获取存储信息QStorageInfobytesTotal(), bytesAvailable()qDebug() << storage.bytesTotal();

1. I/O设备

Qt 中的 I/O 操作通过统一的接口简化了文件与外部设备的操作方式。文件被视为一种特殊的外部设备,因此文件操作与其他外部设备操作是相似的。I/O 操作的本质是对连续存储空间的数据进行读写。

QIODevice 为支持读写数据块(如 QFileQBufferQTcpSocket)的设备提供了通用实现和抽象接口。QIODevice 是一个抽象类,无法直接实例化,但通常使用它定义的接口来提供与设备无关的 I/O 特性。

1.1 I/O设备的类型

  • 顺序存取设备:只能从头开始顺序读写数据,不能指定数据的读写位置。
  • 随机存取设备:可以定位到任意位置进行数据的读写。

QIODebice类继承关系图

1.2 打开模式

文件打开时需要指定模式,模式是一个枚举类型 QIODeviceBase::OpenModeFlag,与 QIODevice::open() 一起使用,描述设备的打开模式。可以通过 QIODevice::openMode() 方法获取当前打开模式。

枚举描述
QIODeviceBase::NotOpen设备未打开
QIODeviceBase::ReadOnly只读设备
QIODeviceBase::WriteOnly只写设备。注意,对于文件系统子类(例如 QFile),这种模式意味着截断(清空文件),除非与 ReadOnlyAppendNewOnly 结合使用。
QIODeviceBase::ReadWrite读写设备
QIODeviceBase::Append以追加模式打开设备,所有数据都会被写入文件的末尾。
QIODeviceBase::Truncate如果可能,打开时会清空设备。
QIODeviceBase::Text读取时,行尾终止符被翻译为 '\n';在写入时,行尾终止符被转换为本地编码,例如在 Windows 中为 '\r\n'
QIODeviceBase::Unbuffered设备中的任何缓冲区都被绕过。
QIODeviceBase::NewOnly如果要打开的文件已经存在,则失败。仅在文件不存在时创建并打开该文件。操作系统保证您是唯一创建和打开文件的人。注意,这种模式意味着 WriteOnly,并且允许与 ReadWrite 结合使用。此标志目前只影响 QFile
QIODeviceBase::ExistingOnly如果要打开的文件不存在,则失败。此标志必须与 ReadOnlyWriteOnlyReadWrite 一起指定。注意,单独将此标志与 ReadOnly 一起使用是多余的,因为当文件不存在时,ReadOnly 已经失败了。此标志目前只影响 QFile

2. 文件读写

2.1 QFile

QFile 是一个用于读写文本、二进制文件和资源的 I/O 设备。它可以单独使用,或者与 QTextStreamQDataStream 一起使用,以提供更方便的操作。

文件名通常在构造函数中传递,但也可以通过 setFileName() 方法在任何时候设置。无论操作系统是什么,QFile 都希望文件分隔符是 '/',不支持使用其他分隔符(例如 '\\')。

可以使用 exists() 方法检查文件是否存在,并使用 remove() 方法删除文件。更高级的文件系统相关操作由 QFileInfoQDir 提供。

文件通过 open() 打开,使用 close() 关闭,使用 flush() 刷新。数据通常通过 QDataStreamQTextStream 读取和写入,但也可以调用 QIODevice 的继承函数如 read()readLine()readAll()write()QFile 还继承了 getChar()putChar()ungetChar(),它们每次只操作一个字符。

文件的大小可以通过 size() 方法获取。您可以使用 pos() 获取当前文件位置,或使用 seek() 移动到新的文件位置。如果已到达文件末尾,atEnd() 将返回 true

打开文件

创建 QFile 对象,通过构造函数或 setFileName() 设置文件名,然后使用 open() 函数以指定的打开模式打开文件。

如果打开失败,可以通过 errorString() 获取失败原因。

void testOpen()
{QFile file("./Maye.txt"); // 只读模式打开if (!file.open(QIODevice::ReadOnly /*| QIODevice::WriteOnly */)){qWarning() << file.fileName() << "open failed:" << file.errorString();return;}file.close(); // 关闭文件
}
写文件

文件打开成功后,使用 write() 来写入数据。

void write()
{QFile file("./Maye.txt");if (!file.open(QIODevice::WriteOnly)) // 只写模式打开{qWarning() << file.fileName() << "open failed:" << file.errorString();return;}// 写入数据qInfo() << "write size" << file.write("hello Mayejun\n");qInfo() << "write size" << file.write(QByteArray("123\n"));file.close(); // 关闭文件
}
读文件

文件打开成功后,使用 read() 读取指定长度的数据,使用 readLine() 读取一行,使用 readAll() 读取所有数据。

void open()
{QFile file("./Maye.txt");if (!file.open(QIODevice::ReadOnly)) // 只读模式打开{qWarning() << file.fileName() << "open failed:" << file.errorString();return;}// 获取文件位置指针的位置qInfo() << "pos" << file.pos();file.seek(0);  // 设置文件位置指针为0qInfo() << "size" << file.size();  // 获取文件大小// 读取一些数据qInfo() << file.read(5);QByteArray arr(10, '\0');qint64 len = file.read(arr.data(), 10);qInfo() << "len" << len << arr;file.close(); // 关闭文件
}
静态函数

QFile 提供了一些静态方法来执行常见的文件操作,如复制、删除、重命名等。

void staticFun()
{// 把 Maye.txt 拷贝到上级目录中的 hello.txt 中 (hello.txt 必须不存在)if (!QFile::copy("Maye.txt", "../hello.txt")){qWarning() << "copy failed!";}// 判断某个文件是否存在if (!QFile::exists("Maye.txt")){qWarning() << "file not exists!";}// 创建符号链接 (快捷方式),后缀必须是 .lnkif (!QFile::link("Maye.txt", "../马也.lnk")){qWarning() << "create link failed!";}// 将指定的文件移动到垃圾桶QString trashPath;if (!QFile::moveToTrash("Maye.txt", &trashPath)){qWarning() << "moveToTrash failed!";}else{qInfo() << "moveToTrash successful, path is" << trashPath;}// 删除文件bool ok = QFile::remove("Maye.txt");qInfo() << ok;if (!ok){qWarning() << "remove failed";}// 重命名文件if (!QFile::rename("Maye1.txt", "Maye2.txt")){qWarning() << "rename failed!";}// 设置文件大小if (!QFile::resize("Maye2.txt", 512)){qWarning() << "resize failed!";}// 返回符号链接引用的文件或目录的绝对路径auto targetStr = QFile::symLinkTarget("../马也.lnk");if (targetStr.isEmpty()){qWarning() << "不是符号链接";}qInfo() << targetStr;
}

2.2 Stream

为了简化文本文件和数据文件的读写操作,Qt 提供了 QTextStreamQDataStream 辅助类。QTextStream 可将写入的数据全部转换为可读文本,QDataStream 可将写入的数据根据类型转换为二进制数据。

QTextStream

QTextStream 可以在 QIODeviceQByteArrayQString 上操作。使用 QTextStream 的流操作符,可以方便地读和写单词、行和数字。对于生成文本,QTextStream 支持字段填充和对齐的格式化选项,以及数字的格式化。

class Student
{
public:qint64 number;QString name;QString grade;qreal math;qreal chinese;qreal english;friend QDebug& operator<<(QDebug& out, const Student& other){out.noquote() << other.number << other.name << other.grade << other.math << other.chinese << other.english;return out;}
};void readStudentInfo()
{QFile file("./student.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) // 以文本模式打开文件{return; // 返回-1不适合在void函数中使用}Student stu;QTextStream stream(&file);qDebug().noquote() << stream.readLine();while (!stream.atEnd()){stream >> stu.number >> stu.name >> stu.grade >> stu.math >> stu.chinese >> stu.english;qDebug() << stu;}
}void test()
{QString res;QTextStream textstream(&res);textstream << "maye" << QString("冷寂") << "young";  // 注意:中文要用 QString 包起来,否则会乱码qDebug() << res;
}
QDataStream

QDataStream 用于处理二进制数据流,通过它可以方便地序列化和反序列化数据。

QByteArray data;
QDataStream stream(&data, QIODevice::ReadWrite);
stream << "image" << 1024 << "ABC"; // 写入数据
// 输出示例: ["\x00\x00\x00\x06image\x00"] [\x00\x00\x04\x00] [\x00\x00\x00\x04" "ABC\x00"]
qDebug() << data << data.size(); // 输出二进制数据

使用 QDataStream 串行化数据。如果数据是字符串,则会在前面用4个字节表示字符串长度;如果是整数,则直接存储。

2.3 QFileInfo

QFileInfo 类提供与系统无关的文件信息,允许用户获取文件的各种属性。

QFileInfo info(file);
QFileInfo info("../QFile-test/what.txt");
qDebug() << info.size();                // 文件大小
qDebug() << info.absoluteFilePath();    // 文件绝对路径(包括文件名)
qDebug() << info.absolutePath();        // 绝对路径(不包括文件名)
qDebug() << info.absoluteDir();         // 绝对路径,返回 QDir
qDebug() << info.path();                // 文件路径
qDebug() << info.filePath();            // 返回文件名,包括路径(可以是绝对路径也可以是相对路径)if (info.isFile())  // 如果是文件
{qDebug() << info.fileName();            // 带后缀的文件名qDebug() << info.baseName();            // 不带后缀的文件名qDebug() << info.suffix();              // 获取文件后缀
}

3. 配置文件

3.1 QSettings

在应用程序中,用户通常希望记录设置(如窗口大小、位置、选项等),以便在下次启动时恢复这些状态。这些设置通常存储在不同的平台上有不同的方式:

  • Windows:系统注册表(如 HKEY_CURRENT_USER\Software\MySoft)。
  • macOS 和 iOS:属性列表文件。
  • Unix 系统:常见地使用 INI 格式的文本文件。

QSettings 提供了对这些存储技术的抽象,使您能够以可移植的方式保存和恢复应用程序设置。它支持多种数据类型,基于 QVariant,例如 QStringQRectQImage

如果只需要一个非持久的基于内存的结构,可以考虑使用 QMap<QString, QVariant>

基本用法

创建 QSettings 对象时,必须提供 公司或组织的名称 以及 应用程序的名称。例如,如果您的公司名为 “NiuBi”,应用程序名为 “QQ”,可以这样构造 QSettings 对象:

QSettings settings("NiuBi", "QQ");

QSettings 对象可以在栈上或堆上创建(使用 new)。构造和销毁对象的速度非常快。

如果在多个地方使用 QSettings,可以通过 QCoreApplication::setOrganizationName()QCoreApplication::setApplicationName() 来指定组织名称和应用程序名称,然后使用无参数的默认构造函数:

QCoreApplication::setOrganizationName("NiuBi");
QCoreApplication::setApplicationDomain("NiuBi.com");
QCoreApplication::setApplicationName("QQ");QSettings settings;  // 使用默认构造函数
设置和获取值

QSettings 存储的每个设置都是一对键值(keyQString 类型,valueQVariant 类型)。使用 setValue() 方法写入设置,例如:

settings.setValue("size", QSize(640, 480));
qDebug() << "Configuration file path:" << settings.fileName();  // 获取配置文件保存位置

如果已有相同键的设置,则新值将覆盖原值。更改可能不会立即保存到永久存储中,可以调用 sync() 方法立即提交更改。

要获取设置的值,可以使用 value() 方法:

QSize size = settings.value("size", QSize(250, 250)).value<QSize>();

如果指定的设置不存在,QSettings 将返回一个空的 QVariant。可以通过传递第二个参数指定默认值。

配置文件格式

在 Windows 上,默认为写入注册表。如果想将设置保存到 .ini 文件中并保存在执行文件所在目录,可以这样设置:

QApplication::setOrganizationName("NiuBi");
QApplication::setApplicationName("QQ");QSettings settings(QApplication::applicationDirPath() + "/qfile.ini", QSettings::Format::IniFormat);
常用函数
  • 设置值
void setValue(const QString &key, const QVariant &value);

设置指定键的值,如果键已存在,则覆盖。

  • 获取值
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;

返回指定键的值。如果该设置不存在,则返回 defaultValue

  • 同步更改
void sync();

将所有未保存的更改写入永久存储,并更新被其他应用程序更改的任何设置。

  • 获取状态
QSettings::Status status() const;

返回 QSettings 遇到的第一个错误状态码,如果没有错误则返回 QSettings::NoError

  • 删除设置
void remove(const QString &key);

删除指定键及其任何子设置。

  • 获取文件路径
QString fileName() const;

返回存储设置的路径。在 Windows 上,如果格式为 QSettings::NativeFormat,则返回系统注册表路径而非文件路径。

分组操作
  • 开始分组
void beginGroup(const QString &prefix);

向当前组添加前缀。

  • 结束分组
void endGroup();

重置组为之前的状态。

  • 获取当前组
QString group() const;

返回当前组名。

  • 开始读取数组
int beginReadArray(const QString &prefix);

向当前组添加前缀并开始从数组读取,返回数组的大小。

  • 开始写入数组
void beginWriteArray(const QString &prefix, int size = -1);

向当前组添加前缀并开始写入大小为 size 的数组。若 size 为 -1,则根据写入条目的索引自动确定。

  • 结束数组
void endArray();

结束数组操作。

  • 设置数组索引
void setArrayIndex(int i);

将当前数组索引设置为 i,后续对 setValue()value()remove()contains() 等函数的调用将针对该索引处的数组项进行操作。

3.2 QJsonDocument

QJsonDocument 是一个用于封装完整 JSON 文档的类,它可以从基于 UTF-8 编码的文本表示中读取和写入该文档。通过 QJsonDocument::fromJson(),可以将 JSON 文档转换为 QJsonDocument。使用 toJson() 方法可以将其转换回文本格式。解析器能够非常快速且有效地将 JSON 转换为 Qt 使用的二进制表示形式。

主要功能
  • 有效性检查:使用 isNull() 方法可以查询已解析文档的有效性。
  • 类型查询:通过 isArray()isObject() 来判断文档是否包含数组或对象。
  • 访问数据:使用 array()object() 方法来检索文档中包含的数组或对象,并进行读取或操作。
解析 JSON

下面的示例展示了如何从文件中读取 JSON 数据并解析为 QJsonDocument

QJsonDocument parseJson(const QString& filePath)
{QFile file(filePath);if (!file.open(QIODevice::ReadOnly)) {return QJsonDocument();  // 返回一个空的 QJsonDocument}QJsonParseError jpe;QJsonDocument jdoc = QJsonDocument::fromJson(file.readAll(), &jpe);if (jdoc.isNull()) {qDebug() << "解析 JSON 失败:" << jpe.errorString();}return jdoc;
}
简单的对象

假设有如下 JSON 对象:

{"name": "顽石老师","course_name": "Qt入门到入土","version": "qt6.5.2","age": 18
}

要获取对象中每个键对应的值,可以使用 QJsonDocument 提供的 operator[] 函数:

void testJsonDoc()
{QJsonDocument jdoc = parseJson("../../../test.json");qDebug() << "版本:" << jdoc["version"].toString();qDebug() << "姓名:" << jdoc["name"].toString();qDebug() << "课程名称:" << jdoc["course_name"].toString();qDebug() << "年龄:" << jdoc["age"].toInt();
}
复杂对象

对于复杂的对象,需要使用 object()array() 方法获取具体对象,然后再进行解析。以下是一个包含多个对象的 JSON 数据示例 (person.json):

{"maye": {"age": 18,"name": "maye","tel": "123456"},"yue": {"age": 26,"name": "顽石","tel": "987654321"}
}

读取“maye”对象的所有信息:

void readComplexJson()
{QJsonDocument jdoc = parseJson("../../../person.json");auto obj = jdoc["maye"].toObject();qDebug() << "姓名:" << obj.value("name").toString();qDebug() << "年龄:" << obj["age"].toInt();qDebug() << "电话:" << obj["tel"].toString();
}

如果想要读取所有对象的信息,可以遍历所有键:

void readAllPersons()
{QJsonDocument jdoc = parseJson("../../../person.json");auto rootObj = jdoc.object();  // 获取根对象auto keys = rootObj.keys();     // 获取所有键for (const auto& key : keys) {auto obj = rootObj[key].toObject();qDebug() << "姓名:" << obj.value("name").toString()<< "年龄:" << obj["age"].toInt()<< "电话:" << obj["tel"].toString();}
}
数组

对于 JSON 数组的处理也相对简单。假设有如下 JSON 数组:

["Apple","Banana","Cherry",42
]

可以通过以下方式解析和输出数组中的元素:

void testJsonArray()
{QJsonDocument jdoc = parseJson("../../../test.json");if (jdoc.isArray()) {QJsonArray array = jdoc.array();for (size_t i = 0; i < array.size(); ++i) {QJsonValue v = array[i];if (v.isString()) {qDebug() << "字符串:" << v.toString();} else if (v.isDouble()) {qDebug() << "数字:" << v.toDouble();} else {qDebug() << "其他类型:" << v;}}}
}

4. 目录/路径

4.1 QDir

QDir 类提供对目录结构及其内容的访问。它的功能包括:

目录操作
  • 创建目录

    bool mkdir(const QString &dirName) const;
    bool mkpath(const QString &dirPath) const;  // 创建多级目录
    
  • 删除目录

    bool rmdir(const QString &dirName) const;   // 删除子目录(必须为空)
    bool rmpath(const QString &dirPath) const;   // 删除路径(必须为空)
    bool remove(const QString &fileName);         // 删除指定文件
    bool removeRecursively();                      // 删除目录及其所有内容
    
  • 重命名目录

    bool rename(const QString &oldName, const QString &newName);
    
目录条目获取
  • 获取指定目录中的所有条目(文件和文件夹)
    QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const;
    QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const;
    QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const;
    QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const;
    
常用路径获取
  • 获取当前路径

    QDir current();        // 返回应用程序当前目录的绝对路径
    QString currentPath();
    
  • 获取用户主目录

    QDir home();           // 例如 C:/Users/Maye
    QString homePath();
    
  • 获取系统临时目录

    QDir temp();
    QString tempPath();
    
  • 获取根目录列表

    QFileInfoList drives();  // 返回 C:/ D:/ 等根目录
    
计算目录大小

使用以下函数可以计算指定目录的大小:

quint32 dirSize(const QString& dirName)
{QDir dir(dirName);if (!dir.exists())return ~0;quint32 size = 0;for (const QFileInfo& info : dir.entryInfoList(QDir::Filter::NoDotAndDotDot | QDir::Files | QDir::Dirs)){if (info.isFile()){size += info.size();}else{size += dirSize(info.filePath());}}return size;
}

4.2 QDirIterator

QDirIterator 允许逐个遍历目录中的条目。它适用于大型目录,因为它一次只列出一个条目,而不是一次列出所有条目。它支持递归列出目录内容,并遵循符号链接。

使用示例

构造 QDirIterator 后,可以依次遍历所有条目:

QDirIterator it("/etc", QDirIterator::Subdirectories);
while (it.hasNext()) {QString dir = it.next();qDebug() << dir;  // 输出每个条目的路径
}

4.3 QStandardPaths

QStandardPaths 类提供访问标准路径的方法,例如用户特定目录或系统配置目录。它帮助开发者在不同操作系统中获取一致的路径,避免硬编码路径可能带来的问题。

静态公有函数
  • 获取本地化显示名称

    [static] QString displayName(QStandardPaths::StandardLocation type);
    
  • 查找可执行文件

    [static] QString findExecutable(const QString &executableName, const QStringList &paths = QStringList());
    
  • 查找文件或目录

    [static] QString locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = LocateFile);
    
  • 查找所有匹配的文件或目录

    [static] QStringList locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = LocateFile);
    
  • 启用测试模式

    [static] void setTestModeEnabled(bool testMode);
    
  • 返回该类型文件所属的所有目录

    [static] QStringList standardLocations(QStandardPaths::StandardLocation type);
    
  • 返回可写类型文件的目录

    [static] QString writableLocation(QStandardPaths::StandardLocation type);
    
枚举:标准位置

QStandardPaths::StandardLocation 描述了各种路径的位置。

  • 示例:获取桌面路径的显示名称

    qDebug() << QStandardPaths::displayName(QStandardPaths::DesktopLocation);  // 输出: "Desktop"
    
  • 示例:获取桌面的可写位置

    qDebug() << QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);  // 输出: "C:/Users/Maye/Desktop"
    
  • 示例:获取数据目录的所有位置

    qDebug() << QStandardPaths::standardLocations(QStandardPaths::DataLocation);
    
查找文件示例
  • 查找可执行文件

    qDebug() << QStandardPaths::findExecutable("calc.exe");  // 查找系统路径下的 calc.exe
    qDebug() << QStandardPaths::findExecutable("7z.exe", QStringList() << "D:\\MySoftWare\\7-Zip");
    
  • 查找特定文件

    qDebug() << QStandardPaths::locate(QStandardPaths::StandardLocation::DownloadLocation, "下拉.png");
    

4.4 QStorageInfo

QStorageInfo 类允许您检索有关磁盘卷的信息,例如可用空间、挂载点、标签和文件系统名称。

创建实例

您可以通过以下两种方式创建 QStorageInfo 实例:

  1. 通过路径:将卷的挂载点路径作为构造函数参数传递。
  2. 使用 setPath() 方法:在创建实例后设置路径。
静态方法
  • 获取所有已挂载的文件系统
    static QList<QStorageInfo> mountedVolumes();
    
缓存与刷新

QStorageInfo 会缓存检索到的信息。如果需要更新信息,可以调用 refresh() 方法使缓存无效。

示例代码
检索系统根卷信息

以下示例展示了如何检索关于系统根卷的常见信息并打印出来:

QStorageInfo storage = QStorageInfo::root();qDebug() << "根路径:" << storage.rootPath();
if (storage.isReadOnly())qDebug() << "只读状态:" << storage.isReadOnly();qDebug() << "卷名:" << storage.name();
qDebug() << "文件系统类型:" << storage.fileSystemType();
qDebug() << "总大小:" << storage.bytesTotal() / 1000 / 1000 << "MB";
qDebug() << "可用大小:" << storage.bytesAvailable() / 1000 / 1000 << "MB";
获取所有可用文件系统

以下示例展示了如何检索所有已挂载的文件系统,并跳过只读文件系统:

for (const QStorageInfo &storage : QStorageInfo::mountedVolumes()) {if (storage.isValid() && storage.isReady()) {if (!storage.isReadOnly()) {// 对可写文件系统进行处理qDebug() << "可写文件系统:" << storage.name();}}
}

refresh() 方法使缓存无效。

示例代码
检索系统根卷信息

以下示例展示了如何检索关于系统根卷的常见信息并打印出来:

QStorageInfo storage = QStorageInfo::root();qDebug() << "根路径:" << storage.rootPath();
if (storage.isReadOnly())qDebug() << "只读状态:" << storage.isReadOnly();qDebug() << "卷名:" << storage.name();
qDebug() << "文件系统类型:" << storage.fileSystemType();
qDebug() << "总大小:" << storage.bytesTotal() / 1000 / 1000 << "MB";
qDebug() << "可用大小:" << storage.bytesAvailable() / 1000 / 1000 << "MB";
获取所有可用文件系统

以下示例展示了如何检索所有已挂载的文件系统,并跳过只读文件系统:

for (const QStorageInfo &storage : QStorageInfo::mountedVolumes()) {if (storage.isValid() && storage.isReady()) {if (!storage.isReadOnly()) {// 对可写文件系统进行处理qDebug() << "可写文件系统:" << storage.name();}}
}

http://www.ppmy.cn/ops/118952.html

相关文章

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器&#xff08;电位器模拟&#xff09;采集光照信息 3、可…

【MyBatis-Plus】 学习记录 常用功能及代码生成器使用

文章目录 1. 环境准备2. 创建基础实体类3. 编写 Mapper 接口4. Service 层5. 控制器层6. 分页功能7. 条件构造器8. 配置乐观锁9. 常见问题10. 代码生成器1. 创建数据库表2. 引入依赖3. 配置数据库连接4. 编写代码生成器5. 运行代码生成器6. 查看生成的代码 MyBatis-Plus 是一个…

Bugku 渗透测试1

描  述: 甲公司邀请你对他们公司进行网络安全测试&#xff0c;但是甲公司只给了一个官网链接你能打到他们内网吗&#xff1f; 打开靶场地址 1、场景1 查看网站源码&#xff0c;查看最下面&#xff0c;得到flag。 2、场景2 根据场景1提示&#xff0c;下个flag网站管理员才能…

WinRAR技巧:如何给多个压缩包设置同一个密码

RAR压缩包是大家经常使用的文件&#xff0c;并且可以进行加密&#xff0c;也是一种文件加密方式&#xff0c;那么当你有很多文件都需要压缩加密&#xff0c;b并且想要设置同一个密码&#xff0c;防止以后忘记密码&#xff0c;该如何高效的完成这个工作呢&#xff1f;今天分享如…

什么是大语言模型?

一、语言模型 要了解大语言模型&#xff0c;首先应当知道什么是语言模型&#xff08;Language Model&#xff09;。语言模型是自然语言处理&#xff08;NLP&#xff09;领域中的一种模型&#xff0c;它用于理解、生成或者处理自然语言文本。语言模型的核心任务是预测一系列单词…

初始MYSQL数据库(8)—— JDBC编程

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 JDBC的概念 JDBC的使用 加载驱动包 建立连接 创建 statement 对象 定义并执行SQL语句 处理结果集 关闭资源 SQL注入 …

Vue转React中JSX小结

Vue转 React 的过程中&#xff0c;首先需要了解 React 中的 JSX&#xff08;JavaScript XML&#xff09;。它在 React 中扮演着类似于 Vue 模板语法的角色。以下是详细而全面的 JSX 总结&#xff0c;帮助你快速上手。 1. 什么是 JSX&#xff1f; JSX介绍 JSX 是一种 JavaScri…