Archivos de aprendizaje, directorios y entrada / salida del módulo Qt Creator (1)
1. Archivos y directorios
1. Dispositivos de entrada / salida
La clase QIODevice es la clase de interfaz básica de todos los dispositivos de E / S en Qt. Por ejemplo, QFile, QBuffer y QTcpSocket proporcionan una interfaz abstracta para dispositivos que admiten la lectura / escritura de bloques de datos.
En todo el proceso, a menudo abrimos el dispositivo a través de la función open () y debemos especificar el modo de apertura correcto. Todos los modos abiertos en QIODevice están definidos por el tipo de enumeración QIODevice :: OpenMode. Puede encontrar el valor usted mismo, hay demasiados ...
Tomemos solo algunos ejemplos
constante | descripción |
---|---|
QIODevice :: NotOpen | El dispositivo no está encendido |
QIODevice :: ReadOnly | El dispositivo se abre como de solo lectura y no se puede escribir |
QIODevice :: WriteOnly | El dispositivo está abierto en modo de solo escritura y no es legible |
QIODevice :: ReadWrite | Abierto para leer y escribir |
QIODevice :: Append | Abrir en modo anexar (al final del archivo) |
QIODevice :: Truncar | Si es posible, el dispositivo se truncará antes de abrirlo y también se perderá el contenido anterior del dispositivo. |
QIODevice :: Texto | Al leer, el terminador de final de línea se convierte a "/ n", al escribir, el terminador de final de línea se convierte a codificación local |
QIODevice :: Sin búfer | Omitir todos los búferes del dispositivo |
Después de escribir y leer, cierre el dispositivo a través de close ().
QIODevice puede distinguir entre dispositivos, en dispositivos de almacenamiento secuenciales y dispositivos de almacenamiento aleatorios.
El dispositivo de almacenamiento aleatorio se puede definir en cualquier posición a través de la función seek (), y la posición actual también se puede obtener con la función pos (). Se utiliza para QFile, QBuffer.
El dispositivo de almacenamiento secuencial no puede ubicar ningún área, y los datos deben leerse una vez para QTcpStock, QProcess.
La función isSequential () determina el tipo de dispositivo en el programa.
QTcpStock y QProcess son dos grandes módulos, ahora estamos hablando de QFile.
2. Operaciones de archivo
La clase QFile proporciona una interfaz para dispositivos de lectura / escritura. Puede leer / escribir archivos de texto, archivos binarios y dispositivos de E / S de recursos Qt. QFile se puede usar solo, pero para mayor comodidad, a menudo lo usamos en combinación con QTextStream / QDataStream.
La clase QFileInfo es para proporcionar información de archivo independiente del sistema, como tamaño, nombre y ubicación.
#include "mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QStringList>
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//以只写方式打开,若文件不存在则创建
QFile file("file.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
qDebug()<<file.errorString();
file.write("hello,Qt \angxn!!");
file.close();
QFileInfo info(file);
qDebug()<<QObject::tr("绝对路径:")<<info.absoluteFilePath()<<endl
<<QObject::tr("文件名:")<<info.fileName()<<endl
<<QObject::tr("基本名称:")<<info.baseName()<<endl
<<QObject::tr("后缀:")<<info.suffix()<<endl
<<QObject::tr("创建时间:")<<info.created()<<endl
<<QObject::tr("大小:")<<info.size();
//以只读方式打开
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
qDebug()<<file.errorString();
qDebug()<<QObject::tr("文件内容:")<<endl<<file.readAll();
qDebug()<<QObject::tr("当前位置:")<<file.pos();
file.seek(0);
QByteArray array;
array = file.read(5);
qDebug()<<QObject::tr("前五个字符:")<<array
<<QObject::tr("当前位置:")<<file.pos();
file.seek(15);
array = file.read(5);
qDebug()<<QObject::tr("第16-20个字符")<<array;
file.close();
return a.exec();
}
Los resultados son los siguientes:
3. Operaciones de directorio
La clase QDir se utiliza para acceder a la estructura del directorio y su contenido, y también puede acceder al nombre de la ruta de la operación, la ruta de acceso y la información relacionada con el archivo.
Tomemos un ejemplo:
arrastre un widget de lista a mainwindow.ui y
luego agregue objetos privados en el archivo .h:
#include <QFileSystemWatcher>
private:
QFileSystemWatcher myWatcher;
private slots:
void showMessage(const QString &path);
main.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&myWatcher,&QFileSystemWatcher::directoryChanged,
this,&MainWindow::showMessage);
connect(&myWatcher,&QFileSystemWatcher::fileChanged,
this,&MainWindow::showMessage);
//显示当前目录下所有文件
QDir mydir(QDir::currentPath());
mydir.setNameFilters(QStringList("*h"));
ui->listWidget->addItem(mydir.absolutePath()+ tr("目录下的.h文件"));
ui->listWidget->addItems(mydir.entryList());
//创建目录加入显示器
mydir.mkdir("mydir");
mydir.cd("mydir");
ui->listWidget->addItem(tr("监视目录:")+mydir.absolutePath());
myWatcher.addPath(mydir.absolutePath());
//创建文件加入监视器
QFile file(mydir.absolutePath()+"/myfile.txt");
if(file.open(QIODevice::WriteOnly)){
QFileInfo info(file);
ui->listWidget->addItem(tr("监视的文件:")+ info.absolutePath());
myWatcher.addPath(info.absoluteFilePath());
file.close();
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::showMessage(const QString &path){
QDir dir(QDir::currentPath()+"/mydir");
//如果目录发生改变
if(path==dir.absolutePath()){
ui->listWidget->addItem(dir.dirName()+tr("目录发生改变:"));
ui->listWidget->addItems(dir.entryList());
}
else{
ui->listWidget->addItem(path+tr("文件发生改变"));
}
}
Todos pueden sentir por sí mismos.