QT-Basis-Tutorial (ausführliche Dateioperation)


Vorwort

In diesem Artikel werden wir weiterhin die Dateioperationen in QT erläutern. Im vorherigen Artikel haben wir bereits die grundlegenden Operationen von Dateien erläutert, daher werden wir in diesem Artikel weitere Kenntnisse in Dateien ausführlich erläutern.

1. QTextStream und QDataStream

QTextStream und QDataStream sind zwei wichtige Klassen für die Datenstromverarbeitung in Qt. Sie werden für verschiedene Arten der Datenverarbeitung verwendet und es gibt einige wesentliche Unterschiede.

QTextStream:
QTextStream wird hauptsächlich zur Verarbeitung von Textdaten verwendet. Es bietet Funktionen zum Lesen und Schreiben von Text und kann zum Lesen und Schreiben von Nur-Text-Dateien, Zeichenfolgen und anderen Textdaten verwendet werden.

Hier ist ein Beispielcode, der zeigt, wie QTextStream zum Lesen und Schreiben von Textdateien verwendet wird:

#include <QFile>
#include <QTextStream>

int main() {
    
    
    // 创建一个文本文件
    QFile file("textfile.txt");

    if (file.open(QIODevice::ReadWrite | QIODevice::Text)) {
    
    
        // 创建一个 QTextStream 对象,并将文件与之关联
        QTextStream stream(&file);

        // 写入文本数据
        stream << "Hello, QTextStream!" << endl;

        // 从文件中读取文本数据
        QString line = stream.readLine();
        qDebug() << "Read from file: " << line;

        // 关闭文件
        file.close();
    } else {
    
    
        qDebug() << "Failed to open file!";
    }

    return 0;
}

QDataStream:
QDataStream wird zum Lesen und Schreiben von Binärdaten verwendet und kann zur Verarbeitung verschiedener Arten von Binärdaten wie Dateien, Netzwerkdatenübertragung usw. verwendet werden. Im Gegensatz zu QTextStream kann QDataStream allgemeinere Datentypen verarbeiten, nicht nur Text.

Im Folgenden finden Sie einen Beispielcode, der zeigt, wie QDataStream zum Lesen und Schreiben von Binärdateien verwendet wird:

#include <QFile>
#include <QDataStream>

int main() {
    
    
    // 创建一个二进制文件
    QFile file("binaryfile.dat");

    if (file.open(QIODevice::ReadWrite)) {
    
    
        // 创建一个 QDataStream 对象,并将文件与之关联
        QDataStream stream(&file);

        // 写入整数和字符串
        int intValue = 42;
        QString stringValue = "Hello, QDataStream!";
        stream << intValue << stringValue;

        // 从文件中读取整数和字符串
        int readIntValue;
        QString readStringValue;
        stream >> readIntValue >> readStringValue;

        qDebug() << "Read integer: " << readIntValue;
        qDebug() << "Read string: " << readStringValue;

        // 关闭文件
        file.close();
    } else {
    
    
        qDebug() << "Failed to open file!";
    }

    return 0;
}

der Unterschied:

1. Datentyp: QTextStream konzentriert sich auf das Lesen und Schreiben von Textdaten, während QDataStream zum Verarbeiten von Binärdaten verwendet wird.

2. Datenformat: QTextStream verwendet ein Textformat, das für Textdateien und Zeichenfolgen mit guter Lesbarkeit geeignet ist. QDataStream verwendet ein Binärformat und eignet sich für allgemeine Binärdaten.

3. Skalierbarkeit: QDataStream ist flexibler und kann mehrere Datentypen verarbeiten, einschließlich benutzerdefinierter Qt-Datentypen, während QTextStream hauptsächlich für Zeichenfolgen und Standardtextdaten verwendet wird.

你可以根据需要选择使用哪个类来处理数据,通常在处理文本数据时使用 QTextStream,在处理二进制数据时使用 QDataStream。

2. QBuffer

QBuffer ist eine Klasse in Qt, die zum Verwalten von Pufferdaten im Speicher verwendet wird. Es ermöglicht Ihnen, Daten in einen Puffer zu lesen und Daten im Puffer auf andere Geräte (z. B. Dateien, Netzwerk-Sockets) zu schreiben. Im Folgenden werde ich QBuffer erläutern und ein Beispiel für den Verwendungscode bereitstellen.

QBuffer-Übersicht:
Die QBuffer-Klasse ist eine Unterklasse von QIODevice, kann also wie eine Datei lesen und schreiben, speichert Daten jedoch in einem In-Memory-Puffer statt in einer Festplattendatei. Dies ist in Situationen nützlich, in denen Daten im Speicher bearbeitet werden müssen, ohne dass tatsächliche Dateien beteiligt sind.

Beispiel für einen Verwendungscode:
Das Folgende ist ein einfacher Beispielcode, der zeigt, wie QBuffer verwendet wird, um Daten in einen Puffer zu schreiben und Daten aus dem Puffer zu lesen:

#include <QCoreApplication>
#include <QBuffer>
#include <QDebug>

int main(int argc, char *argv[]) {
    
    
    QCoreApplication a(argc, argv);

    // 创建一个 QBuffer 对象
    QBuffer buffer;

    // 打开缓冲区以进行写入
    buffer.open(QIODevice::WriteOnly);

    // 创建一个 QTextStream 对象,用于向缓冲区写入数据
    QTextStream out(&buffer);

    // 向缓冲区写入数据
    out << "Hello, QBuffer!" << endl;
    out << "This is a sample text." << endl;

    // 关闭缓冲区
    buffer.close();

    // 打开缓冲区以进行读取
    buffer.open(QIODevice::ReadOnly);

    // 创建一个 QTextStream 对象,用于从缓冲区读取数据
    QTextStream in(&buffer);

    // 从缓冲区中读取数据并打印到控制台
    while (!in.atEnd()) {
    
    
        QString line = in.readLine();
        qDebug() << "Read from buffer: " << line;
    }

    // 关闭缓冲区
    buffer.close();

    return a.exec();
}

In diesem Beispiel erstellen wir zunächst ein QBuffer-Objekt und öffnen es im schreibgeschützten Modus mit der open-Methode. Dann erstellen wir ein QTextStream-Objekt und schreiben die Daten in den Puffer. Als nächstes schließen wir den Puffer, öffnen ihn erneut im schreibgeschützten Modus und verwenden dann QTextStream, um die Daten aus dem Puffer zu lesen und auf der Konsole auszugeben.

Dieses Beispiel zeigt, wie Sie QBuffer verwenden, um Daten im Speicher zu verarbeiten, ohne eine tatsächliche Datei bearbeiten zu müssen. Sie können je nach Bedarf verschiedene Datentypen lesen und schreiben, nicht nur Textdaten.

san, QDir

QDir ist eine Klasse in Qt zum Arbeiten mit Dateien und Verzeichnissen. Es bietet viele Methoden zum Ausführen von Datei- und Verzeichnisvorgängen wie Erstellen, Löschen, Umbenennen, Durchsuchen von Verzeichnissen usw. Im Folgenden erkläre ich QDir und stelle ein Beispiel für einen Verwendungscode bereit.

QDir-Übersicht:
Die QDir-Klasse wird verwendet, um Verzeichnisse in einem Dateisystem darzustellen und zu bearbeiten. Es können folgende Vorgänge ausgeführt werden:

Listen Sie Dateien und Unterverzeichnisse in einem Verzeichnis auf.
Verzeichnisse erstellen, löschen und umbenennen.
Rufen Sie den Pfad, den Namen und die Attribute eines Verzeichnisses ab.
Führen Sie eine Dateifilterung durch.
Verwalten Sie Dateien und Unterverzeichnisse innerhalb eines Verzeichnisses.

Beispiel für einen Verwendungscode:
Das Folgende ist ein einfacher Beispielcode, der zeigt, wie die QDir-Klasse zum Auflisten von Dateien und Unterverzeichnissen in einem Verzeichnis verwendet wird:

#include <QCoreApplication>
#include <QDir>
#include <QDebug>

int main(int argc, char *argv[]) {
    
    
    QCoreApplication a(argc, argv);

    // 指定要操作的目录路径
    QDir directory("/path/to/your/directory");

    // 列出目录中的所有文件
    QStringList files = directory.entryList(QDir::Files);
    qDebug() << "Files in the directory:";
    for (const QString &file : files) {
    
    
        qDebug() << file;
    }

    // 列出目录中的所有子目录
    QStringList subDirectories = directory.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
    qDebug() << "Subdirectories in the directory:";
    for (const QString &subDir : subDirectories) {
    
    
        qDebug() << subDir;
    }

    return a.exec();
}

In diesem Beispiel erstellen wir zunächst ein QDir-Objekt und geben den Verzeichnispfad an, auf dem gearbeitet werden soll. Anschließend verwenden wir die Methode „entryList“, um die Dateien und Unterverzeichnisse im Verzeichnis aufzulisten. QDir::Files bedeutet das Auflisten von Dateien, QDir::Dirs bedeutet das Auflisten von Unterverzeichnissen und QDir::NoDotAndDotDot wird verwendet, um die beiden speziellen Verzeichnisse „.“ und „…“ auszuschließen.

Sie können QDir verwenden, um nach Bedarf andere Datei- und Verzeichnisvorgänge auszuführen, z. B. das Erstellen, Löschen, Umbenennen von Verzeichnissen, das Abrufen von Dateiattributen usw. Diese Klasse bietet umfassende Funktionalität für die Arbeit mit Dateien und Verzeichnissen im Dateisystem.

4. QFileSystemWatcher-Klasse

QFileSystemWatcher ist eine Klasse in Qt, die zur Überwachung von Änderungen in Dateien und Verzeichnissen im Dateisystem verwendet wird. Es ermöglicht Ihnen, zu überwachende Dateien oder Verzeichnisse zu registrieren und dann Benachrichtigungen zu erhalten, wenn sich diese Dateien oder Verzeichnisse ändern. Dies ist nützlich für Anwendungen, die auf Änderungen im Dateisystem reagieren und entsprechende Vorgänge in Echtzeit ausführen müssen. Im Folgenden werde ich die Hauptfunktionen und die Verwendung der QFileSystemWatcher-Klasse ausführlich erläutern.

Hauptfunktionen:
1. Datei- und Verzeichnisüberwachung: QFileSystemWatcher kann Änderungen in Dateien und Verzeichnissen überwachen. Sie können Datei- oder Verzeichnispfade zur Überwachung über die Methode addPath() oder addPaths() hinzufügen.

2. Ereignisbenachrichtigung: Wenn sich die überwachte Datei oder das überwachte Verzeichnis ändert, sendet QFileSystemWatcher ein Signal, um die Anwendung zu benachrichtigen. Sie können sich mit diesen Signalen verbinden, um in Echtzeit auf Dateisystemänderungen zu reagieren.

3. Plattformübergreifende Unterstützung: QFileSystemWatcher bietet konsistente Schnittstellen auf verschiedenen Plattformen, sodass Sie problemlos plattformübergreifenden Dateiüberwachungscode schreiben können.

Anwendungsbeispiel:
Im Folgenden finden Sie einen einfachen Beispielcode, der zeigt, wie Sie mit QFileSystemWatcher Änderungen an Dateien in einem angegebenen Verzeichnis überwachen und Benachrichtigungen erhalten, wenn sich Dateien ändern:

#include <QCoreApplication>
#include <QFileSystemWatcher>
#include <QDebug>

int main(int argc, char *argv[]) {
    
    
    QCoreApplication a(argc, argv);

    // 创建 QFileSystemWatcher 对象
    QFileSystemWatcher watcher;

    // 添加要监视的文件或目录路径
    QString filePathToWatch = "/path/to/your/file_or_directory";
    watcher.addPath(filePathToWatch);

    // 连接文件变化信号到槽函数
    QObject::connect(&watcher, &QFileSystemWatcher::fileChanged, [](const QString &path) {
    
    
        qDebug() << "File" << path << "has changed.";
    });

    // 启动事件循环
    return a.exec();
}

In diesem Beispiel erstellen wir zunächst ein QFileSystemWatcher-Objekt und verwenden dann die Methode addPath(), um den zu überwachenden Datei- oder Verzeichnispfad hinzuzufügen. Als nächstes haben wir das fileChanged-Signal mit einer Slot-Funktion verbunden, die aufgerufen wird, wenn sich die Datei ändert. Abschließend wird die Ereignisschleife durch den Aufruf von a.exec() gestartet, wodurch die Anwendung weiter ausgeführt wird, um Benachrichtigungen über Dateiänderungen zu empfangen.

Wenn sich die angegebene Datei oder das angegebene Verzeichnis ändert, wird das fileChanged-Signal ausgelöst und die Slot-Funktion führt die entsprechenden Informationen aus und gibt sie aus.

Zusätzlich zum FileChanged-Signal stellt QFileSystemWatcher auch andere Signale bereit, z. B. DirectoryChanged (Verzeichnisänderung), FileRenamed (Dateiumbenennung) usw., um unterschiedliche Überwachungsanforderungen zu erfüllen.

请注意,QFileSystemWatcher 的功能受限于操作系统和文件系统的支持,因此在某些情况下,可能无法监视到所有文件系统事件。

Zusammenfassen

Dieser Artikel wird es hier erklären.

Supongo que te gusta

Origin blog.csdn.net/m0_49476241/article/details/132996667
Recomendado
Clasificación