一、简介

通过QFile、QDir、QFileInfo和QFileSystemWatcher类简单介绍对文件和目录的一些操作。对文本流和数据流没有太多的介绍,还有一些Qt资源、统一资源定位符、缓冲区可以在以后应用中加上。

二、详解

1、QFile
可以读写文本文件、二进制文件和Qt资源文件,也可以和QTextStream和QDataStream一起使用。

读取文本流耗时情况可参考:https://blog.csdn.net/Aidam_Bo/article/details/84319851

(1)读写文本文件

QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {return -1;}while (!file.atEnd()) {QByteArray line = file.readLine();for (int i = 0; i < line.size(); ++i)cout << line[i];    }file.seek(0);      //回到文件开头QTextStream in(&file);while (!in.atEnd()) {QString line = in.readLine();cout << qPrintable(line) << endl;}
{QFile file("logfile.log");file.open(QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text);QTextStream out(&file);out << QString("log11111") << endl;file.close();
}

(2)读写二进制文件

    QFile file("binary.file");file.open(QIODevice::WriteOnly | QIODevice::Truncate);QDataStream out(&file);   out << QString("huazaimei");   out << QDate::fromString("2018/12/26", "yyyy/MM/dd");out << (qint32)100;file.close();file.setFileName("binary.file");if(!file.open(QIODevice::ReadOnly)) {return -1;}QDataStream in(&file);QString name;QDate birthday;qint32 age;in >> name >> birthday >> age;qDebug() << name << birthday << age;cout << qPrintable(name) << '\t' << qPrintable(birthday.toString("yyyy MMMM dd dddd")) << "\t" << age << endl;file.close();

2、QDir

QDir可以操作目录,存取目录或文件信息,操作底层文件系统,而且还可以存取Qt的资源文件。Qt使用/作为通用的目录分割符和URL路径分隔符,Qt会自动地转换你的路径来匹配你的基础的操作系统。Qt可以使用相对路径和绝对路径指向一个文件,isRelative()和 isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。将相对路径转换为绝对路径使用makeAbsolute()函数。目录 路径可以通过path()函数返回,通过setPath()函数设置新路径,绝对路径使用absolutePath()返回。目录名可以使用 dirName()返回。目录的路径可以通过cd()、cdUp()改变,可以使mkdir()创建目录,rename()改变目录名。判断目录是否存在可以使用exists(),目录的属性可以使用 isReadable(),isAbsolute(),isRelative()和isRoot()来获取,目录下有很多条目,包括文件、目录和符号链 接,总的条目数可以使用count()来统计。entryList()可以返回目录下所有条目组成的字符串链表,文件可以使用remove()函数删 除,rmdir()删除目录。

(1) 绝对路径的用法:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")或使用QDir("C:\\Documents and Settings")来代替

相对路径的用法:
QDir("images/landscape.png")

(2) QDir mDir("/home/user/Desktop");

mDir.exists(); //测试文件是否存在

mDir.absoluteFilePath("main.cpp"); //返回指定目录下指定文件的绝对路径

mDir.dirName(); //剥离掉路径,只返回目录的名字

其他的可以参看QT文档。

3、QFileInfo
       QFileInfo类提供了与系统无关的文件信息,它能提供文件名称和路径,存取权限,以及文件是否为目录或符号链接,文件大小,以 及最后修改/读取的时间等。QFileInfo也能从资源中获取信息。QFileInfo可以使用相对路径或绝对路径。

更多QFileInfo信息,请参考:https://blog.csdn.net/Aidam_Bo/article/details/85261475

(1)文件属性信息

下面也是QFileInfo属性信息的经典例子:

    QFileInfo info("/home/aoyang/network-manager-applet.tar.gz");bool isExists            = info.exists();            //判断文件是否存在,若存在返回trueqint64 size              = info.size();              //获取文件大小,返回bytesQDateTime created        = info.created();           //文件创建时间QDateTime lastModified   = info.lastModified();      //文件最近修改时间QDateTime lastRead       = info.lastRead();          //文件最近读取时间bool isDir               = info.isDir();             //判断是否是路径bool isFile              = info.isFile();            //判断是否是文件bool isSymLink           = info.isSymLink();         //判断是否是符号链接bool isHidden            = info.isHidden();          //文件是否隐藏bool isReadable          = info.isReadable();        //文件是否可读bool isWritable          = info.isWritable();        //文件是否可写bool isExecutable        =info.isExecutable();       //文件是否可执行

(2)文件路径信息

    QString absolutefilepath = info.absoluteFilePath();   //绝对文件路径:/home/aoyang/network-manager-applet.tar.gzQString absolutepath     = info.absolutePath();       //绝对路径不包含文件名:/home/aoyangQString basename         = info.baseName();           //无路径并第一个.前的名称:network-manager-appletQString completebasename = info.completeBaseName();   //最后一个.前的名称:network-manager-applet.tarQString completesuffix   = info.completeSuffix();     //第一个.后的后缀:tar.gzQString filename         = info.fileName();           //文件全名称:network-manager-applet.tar.gzQString filepath         = info.filePath();           //文件路径全名称:/home/aoyang/network-manager-applet.tar.gzQString path             = info.path();               //文件路径:/home/aoyangQString suffix           = info.suffix();             //文件后缀:gz

4、QFileSystemWatcher文件系统监视器

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QFileSystemWatcher>namespace Ui {class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void showMessage(const QString &path);private:Ui::MainWindow *ui;QFileSystemWatcher myWatcher;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 将监视器的信号和自定义的槽进行关联connect(&myWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(showMessage(QString)));connect(&myWatcher, SIGNAL(fileChanged(QString)), this, SLOT(showMessage(QString)));// 显示出当前目录下的所有.h文件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.absoluteFilePath());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("文件发生改变!"));}
}
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QListWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>QT_BEGIN_NAMESPACEclass Ui_MainWindow
{
public:QWidget *centralWidget;QVBoxLayout *verticalLayout;QListWidget *listWidget;QMenuBar *menuBar;QToolBar *mainToolBar;QStatusBar *statusBar;void setupUi(QMainWindow *MainWindow){if (MainWindow->objectName().isEmpty())MainWindow->setObjectName(QString::fromUtf8("MainWindow"));MainWindow->resize(400, 300);centralWidget = new QWidget(MainWindow);centralWidget->setObjectName(QString::fromUtf8("centralWidget"));verticalLayout = new QVBoxLayout(centralWidget);verticalLayout->setSpacing(6);verticalLayout->setContentsMargins(11, 11, 11, 11);verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));listWidget = new QListWidget(centralWidget);listWidget->setObjectName(QString::fromUtf8("listWidget"));verticalLayout->addWidget(listWidget);MainWindow->setCentralWidget(centralWidget);menuBar = new QMenuBar(MainWindow);menuBar->setObjectName(QString::fromUtf8("menuBar"));menuBar->setGeometry(QRect(0, 0, 400, 25));MainWindow->setMenuBar(menuBar);mainToolBar = new QToolBar(MainWindow);mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);statusBar = new QStatusBar(MainWindow);statusBar->setObjectName(QString::fromUtf8("statusBar"));MainWindow->setStatusBar(statusBar);retranslateUi(MainWindow);QMetaObject::connectSlotsByName(MainWindow);} // setupUivoid retranslateUi(QMainWindow *MainWindow){MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));} // retranslateUi};namespace Ui {class MainWindow: public Ui_MainWindow {};
} // namespace UiQT_END_NAMESPACE#endif // UI_MAINWINDOW_H

 总结

目录的改变和文件的改变都能监视到,文件改变会收到一次信号,但是文件改变目录发出了很多次变化,其中除了临时文件的创建和删除,还有两次不知道为什么会收到信号,这个等有机会在了解。
四、总结
(1)只是总结了常用的部分,其他的使用时可以直接参看Qt的参考文档,Qt5.9又加入了许多比较新的特性。

(2)本人思路有限,若有更好的建议,可以留言,共同学习交流。

Qt总结之五:读写文件操作相关推荐

  1. python怎么读取文件-python怎么读写文件操作

    本节内容:I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input/ ...

  2. [C++调试笔记]执行声明的读写文件操作

    FILE* fp_init, * fp_aver, * fp_flux_aver, * fp_ener_flux_aver, * fp_dura; FILE* fp_who[SHOWNUMB]; // ...

  3. python怎么读写文件-python怎么读写文件操作

    本节内容:I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input/ ...

  4. C# IO流读写文件操作

    C# IO流读写文件操作 1.创建文件流 2.创建文件读写器 3.执行读写操作 4.关闭文件读写器和文件流 1.创建文件流 string filePath = AppDomain.CurrentDom ...

  5. Node.js文件系统模块——读写文件操作

    文章目录 前言 一.导入fs模块 1.readFile() && readFileSync() 2.writeFile() && writeFileSync() 3.a ...

  6. python以读写方式打开文件_python读写文件操作详细介绍【传智播客】

    Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...

  7. linux下c语言读写文件操作,linux下的系统级c语言文件读写操作

    最近初次接触Linux这么高端的东西,有种进城的感觉.进了linux,发现城里人说话做事的方式都很不一样. 个人感觉,初次接触linux主要的痛点在于命令行交互的方式,这就要求我接受城里人的思维,wh ...

  8. Python中open读写文件操作

    Python内置了读写文件的函数open() 1.读文件(使用内置的open()函数) f = open('/Users/michael/test.txt', 'r') 'r' 表示读,我可以可以利用 ...

  9. jsp写java文件,java(JSP)读写文件操作 | 学步园

    JAVA读写指定文件内容,工作中用到的,放在这里给大家分享一下. 以下为读写文件类: package com.hexun.wap.zgpack; import java.io.BufferedRead ...

  10. java io importnews_java(JSP)读写文件操作

    [有些时候,会报错,错误提示为: Can not find the tag library descriptor for http://java.sun.com/jsp/jstl/core 解决此问题 ...

最新文章

  1. python staticmethod and classmethod方法
  2. 使用Storm实现WordSum
  3. poj 3020 Antenna Placement(二分图最大匹配)
  4. mysql的分区技术作用_理解MySQL数据库分区管理的技术细节
  5. TensorFlow1.0正式发布,AI圈“互怼”那些事儿 | AI科技评论周刊
  6. 飞桨PaddlePaddle升级解读 | PaddleDetection物体检测统一框架
  7. php开启mysqlnd,如何启用mysqlnd的PHP?
  8. 诸暨机器人餐厅价格_现场 | 一家尝出“锅气”的餐厅 探店机器人餐厅
  9. vue.js python_使用Python和Vue.js自动化报告过程
  10. postman 使用_postman如何使用集合断言?
  11. Angular5.0之 安装指定版本Angular CLI
  12. 我的YUV播放器MFC小笔记:设置picture控件背景为黑色、窗口缩放
  13. windos 为什么会突然服务停止了_女生为什么会突然说分手?
  14. php memcache数据类型,php读取memcache二进制数据
  15. 面向对象分析与设计阅读笔记一
  16. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_5_文件存储的原理和记事本打开文本显示原理...
  17. MPPT “最大功率点跟踪”
  18. 【pygame】微信飞机大战
  19. aforge 相机标定_C# Aforge设置摄像头视频属性和控制属性
  20. python在统计专业的应用_Python统计学statistics实战

热门文章

  1. C#笔记03 运算符和分支结构
  2. 今天的时间逻辑以及fix 一个 mysql 程序员错误的习惯
  3. CSS边距---盒子模型
  4. java设计智慧教室_物联网智慧教室设计方案,更便捷的智慧教学体验
  5. 三维点云学习(3)6- 实现K-Means
  6. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)
  7. LeetCode-29:不使用乘法、除法和 mod 运算符如何求解两数之商,真实面试中遇到过
  8. python重复字符串n次的函数_LeetCode_Python(3)_无重复字符的最长子串
  9. SpringBoot集成Activiti Explorer
  10. Log4net使用指南[转]