访问IO设备,需要先调用open()来设置正确的OpenMode(例如ReadOnly或ReadWrite)
打开设备后后,使用write() 或putChar() 写入数据到文件和设备,并通过调用read(),readLine()
或readAll() 进行读取;使用完设备后,还需调用close()。QIODevice区分两种类型的设备:随机访问设备(Random-access devices)和顺序设备(Sequentialdevices)。
1,QFile
QFile是用于文件的创建、读写、复制、删除等等,可以实现文本文件和二进制文件的读写。 QFile 的接口函数可以参考下Qt帮助文档,下面程序是读取普通文件按行提取。QFile一般用来读写文件文件,文件流操作类QTextStream和QTextStream用来读写二进制文件。
QFile file(textfile);
//当文件无法进行读操作的时候,将弹出信息框
if(!file.open(QFile::ReadOnly|QFile::Text))
{
QMessageBox::warning(this,tr("Error"),tr("read file error:&1").arg(file.errorString()));
return;
}
else
{
QString line;
QTextStream in(&file); //用文件构造流
line = in.readLine();//读取一行放到字符串里
qDebug() << line;
while(!line.isNull())//字符串有内容
{
line=in.readLine();//循环读取下行
qDebug() << line;
}
}
2,QTextStream
QTextStream类提供了用于读取和写入文本的便捷接口。QTextStream可以操作QIODevice, QByteArray和QString,调用QTextStream的流操作可以方便的读取文字、行、数字等,还提供了文本填充和对齐的相关格式。QTextStream内部使用基于Unicode的缓冲区,并且QTextStream使用QTextCodec自动支持不同 的字符集。默认情况下,QTextCodec::codecForLocale() 用于读取和写入,但是您也可以通过调用setCodec() 来设置编解码器。QTextStream还支持自动Unicode检测, 启用此功能(默认行为)后,QTextStream将检测UTF-16或UTF-32 BOM(Byte Order Mark,字节顺序标记),并在读取时切换到适当的UTF编解码器。QTextStream默认情况下不编写BOM,但是您可以通过调用setGenerateByteOrderMark(true)来启用它,当QTextStream直接在QString上运行时,将禁用编解码器。
// 用文本流写入指定文件
void MainWindow::on_btn_QTextStream_write_clicked()
{
QFile file(m_textstreampath);
if (!file.open(QIODevice::WriteOnly|QIODevice::Text))
return;
ui->lineEdit->setText(m_textstreampath);
QTextStream out(&file); //用文本流读取文件内容
out << ui->textEdit->toPlainText();
file.close();
}
void MainWindow::on_btn_QTextStream_read_clicked()
{
QFile file(m_textstreampath);
if (!file.open(QFile::ReadOnly|QIODevice::Text))
return;
QTextStream in(&file); //用文本流读取文件内容
ui->lineEdit->setText(m_textstreampath);
ui->textEdit->clear();
QString str = in.readAll(); //读取全部内容
ui->textEdit->append(str); //显示内容
file.close();
}
void MainWindow::on_cBox_Codec_currentIndexChanged(const QString &arg1)
{
QTextCodec::setCodecForLocale(QTextCodec::codecForName(arg1.→ toLocal8Bit()));
}
3,QDataStream
QDataStream类用于对数据进行二进制格式的读/写操作。QDataStream可以序列化C++的基本数
据类型的功能,也就是可以将数据按照某种特定的二进制编码进行解析或存储,另外也可以读
取/写入未编码的原始二进制数据。
QDataStream以数据流的方式读写文件,使用Qt预定义的编码方式或者是原始二进制的数据方
式,下面读取和写入文件,先使用QFile这种普通读写,然后转成数据流或者字节流读取,这样
便于操作,而且不会乱码。
void MainWindow::on_btn_QDataStream_write_clicked()
{
static int writeCount=0;
QFile file(m_datastreampath);
ui->lineEdit->setText(m_datastreampath);
if(file.open(QIODevice::WriteOnly))
{
QDataStream out(&file);
out << ui->textEdit->toPlainText();
out << ++writeCount;
file.close();
}
}
void MainWindow::on_btn_QDataStream_read_clicked()
{
QFile file(m_datastreampath);
ui->lineEdit->setText(m_datastreampath);
if(file.open(QIODevice::ReadOnly))
{
QDataStream in(&file);
QString str;
int writeCount;
in >> str >> writeCount;
file.close();
ui->textEdit->clear();
ui->textEdit->append(str);
ui->textEdit->append(QString::number(writeCount));
}
}
4,QDir
QDir用于操纵路径名,访问有关路径和文件的信息以及操纵底层文件系统。
5,QFileInfo
QFileInfo类提供与系统无关的文件信息,获取关文件在文件系统中的名称和位置(路径),以及文件的权限和文件类型,文件的大小和上次修改/读取的时间也通过接口获取。QFileInfo可以指向具有相对或绝对文件路径的文件。
6,QFileSystemWatcher
QFileSystemWatcher通过观察指定路径的列表来监视文件系统中文件和目录的更改,当文件已被
修改,重命名或从磁盘中删除就会发送fileChanged()。当目录或其内容被修改或删除时,会发出directoryChanged()信号。一旦文件被重命名或从硬盘删除或者是目录从磁盘上删除,QFileSystemWatcher将停止监控。
void MainWindow::on_btn_Watch_clicked()
{
QString curPath=QDir::currentPath();//获取应用程序的路径
QString dlgTitle="选择文件夹"; //对话框标题
QString dirname=QFileDialog::getExistingDirectory(this,dlgTitle,→ curPath);
if (dirname.isEmpty())
return;
QFileSystemWatcher *fileSystemWatcher = new QFileSystemWatcher(this);
fileSystemWatcher->addPath(dirname);
connect(fileSystemWatcher,SIGNAL(directoryChanged(const QString &)),
->this, SLOT(handDirChanged(const QString &)));
connect(fileSystemWatcher,SIGNAL(fileChanged(const QString &)),this,→ SLOT(handFileChanged(const QString &)));
}
void MainWindow::handFileChanged(const QString &path)
{
QString dlgTitle="information";
QString str="文件改变:"+path;
QMessageBox::information(this, dlgTitle, str,QMessageBox::Yes);
}
void MainWindow::handDirChanged(const QString &path)
{
QString dlgTitle="information";
QString str="文件夹改变:"+path;
QMessageBox::information(this, dlgTitle, str,QMessageBox::Yes);
}
6,QTemporaryFile和QTemporaryDir和QCoreApplication
(1)QTemporaryFile用于安全地创建唯一的临时文件,该文件本身是通过调用open()创建的。
临时文件的名称保证是唯一的(保证您不会覆盖现有文件),并且在销毁QTemporaryFile对象时将删除该文件。
临时文件的打开方式为 QIODevice::ReadWrite
这样可避免将数据存储在临时文件中的应用程序破坏数据。
(2)使用QTemporaryFile创建临时文件非常简单,可以使用静态函数QTemporary-File::createTemplateFile() 创建文件,会返回一个QTemporaryFile对象。可以像普通文件一样进行读写操作,使用open() 打开,当不再需要使用临时文件时,调用close()方法关闭文件即可。
需要注意的是,临时文件在程序结束后会被自动删除(QTemporaryFile 对象销毁时),因此不需
要手动删除临时文件。如果需要手动控制临时文件的删除时间,可以使用QFile::setAutoRemove()
方法设置是否自动删除文件。
(3)QCoreApplication是无 UI 应用程序提供事件循环的类,是所有应用程序的基类。对于GUI程序,应该用QGuiApplication,而对于采用了Qt Widget模块的程序,应该使用QApplication,例如:我们使用 Qt Creator 创建的Qt Widget Application都是基于QApplication。它们之间的继承关系是:QCoreApplication -> QGuiApplicatioin -> QApplication。QCoreApplication 提供了一些有用的静态函数,可以用来获取应用程序的名称,启动路径等信息。继承于此类的子类,也可以使用QCoreApplication的相关方法,如applicationDirPath() 获取可执行应用文件所在目录;applicationFilePath() 获取可执行应用文件路径。
// 默认文件路径和名称
m_datastreampath = qApp->applicationDirPath()+"/datastream.dat";
m_textstreampath = qApp->applicationDirPath()+"/textstream.txt";
m_filepath = qApp->applicationDirPath()+"/document";