目录
2.4、QTemporaryDir和QTemporaryFile
1、文件操作
QT提供了2种读写文件的基本方法,一种是QFile类的IDDevice读写功能直接进行读写,另一种是利用QFile和QTextStream结合起来,用流的方法进行文件读写。
1.1、文本读写
1.1.1、QFile
QFile 类提供了读取和写入文件的接口。 QFile 可以自己使用,也可以更方便地与 QTextStream 或 QDataStream一起使用(通常使用 QDataStream 或 QTextStream 读写数据)。
静态函数 | |
bool copy(const QString &fileName, const QString &newName) | 复制文件 |
bool rename(const QString &oldName, const QString &newName) | 重命名文件 |
bool remove(const QString &fileName) | 删除文件 |
bool exists(const QString &fileName) | 检查文件是否存在 |
bool setPermissions(const QString &filename, Permissions permissionSpec) | 设置文化的权限 |
Permissions permissions(const QString &filename) | 返回文件的权限 |
成员函数 | |
void setFileName(const QString &name) | 设置文件名,文件打开后不能再调用此函数 |
bool copy(const QString &newName) | 将当前文件复制为newName表示的文件 |
bool rename(QString& newName) | 将当前的文件重命名为newName |
bool remove() | 删除当前文件 |
bool exists() | 检查当前文件是否存在 |
bool setPermissions(Permissions permissionSpec) | 设置文化的权限 |
Permissions permissions() | 返回文件的权限 |
qint64 size() | 返回文件的大小 |
bool open(OpenMode flags) | 打开文件。 QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。 QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。 QIODevice::ReadWrite:以读写方式打开。 QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。 QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部被删除。 QIODevice::Text:以文本方式打开文件,读取时“\n”被自动翻译为换行符,写入时字符串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”。 |
QByteArray readAll() | 读取数据 |
void close() | 关闭文件 |
bool flush() | 刷新文件 |
qint64 pos() | 获取当前文件位置 |
bool seek(qint64 offset) | 移动到新的文件位置 |
bool atEnd() | 是否已经到达文件的末尾 |
qint64 read(char *data, qint64 maxlen) | 读数据 |
qint64 write(const char *data, qint64 len); | 写数据 |
1.1.2、QTextStream
QTextStream 类为读写文本提供了一个方便的接口,常与 QFile 结合使用。QTextStream可以使用 “<<”和“>>” 进行操作流。QTextStream 可以在 QIODevice(QFile、QTemporaryFile、QBuffer、QTcpSocket、QUdpSocket)、 QByteArray 或 QString 上操作。
QString readAll() | 读取数据 |
void setAutoDetectUnicode(bool enabled) | 设置自动检测Unicode |
bool atEnd() | 是否已经到达文件的末尾 |
QString readLine(qint64 maxlen = 0) | 通过自动换行符来读取一行字符串 |
1.1.3、读取文本流程
1.1.3.1、不使用QTextStream
*1)调用QFileDialog::getOpenFileName()获取文本路径
2)调用isEmpty()判断文本路径是否存在
3)设置QFile文本file.setFileName(fileName);
4)调用exists()判断文件是否存在
5)调用open()打开
6)调用readAll()读取内容
7)调用close()关闭
2.1.3.2、使用QTextStream
*1)调用QFileDialog::getOpenFileName()获取文本路径
2)调用isEmpty()判断文本路径是否存在
3)设置QFile文本file.setFileName(fileName);
4)调用exists()判断文件是否存在
5)调用open()打开
6)定义QTextStream,将QFile作为参数传入
7)调用setAutoDetectUnicode(true),如果文本文件种有汉字,需要设定为自动识别Unicode码
8)使用QTextStream的readAll()读取内容
9)调用close()关闭
1.1.4、写入文本流程
1.1.4.1、不使用QTextStream
1*)调用toUtf8()将QString转换为QByteArray;
2)调用open()打开
3)调用write()函数写入内容
4)调用close()关闭
1.1.4.2、使用QTextStream
1)调用open()打开
2)定义QTextStream,将QFile作为参数传入
3)使用<<直接将QString写入QTextStream
4)调用close()关闭
1.2、二进制读写
QT使用QFile和QDataStream进行二进制数据文件的读写。QFile负责文件的IO设备接口,QDataStream以数据流的方式读取文件内容或写入文件内容。
QT有2种二进制格式:
1)Qt预定义编码,文件后缀名为“.stm”
2)标准编码数据文件,文件后缀名为".dat"
1.2.1、QDataStream
void QDataStream::setVersion(int v) | 流版本号,写入和读取版本要兼容。v是QDataStream::Version枚举类型的值 |
void setByteOrder(ByteOrder) | 设置字节序,参数是QDataStream::ByteOrder枚举类型常量 |
int writeRawData(const char *, int len) | 将数据写入数据流 |
QDataStream &writeBytes(const char *, uint len) | 在写入数据时,会先将len作为一个quint32类型写入数据流,此函数适用于字符串数据的写入。 |
int readRawData(char *, int len) | 从数据流读取数据 |
QDataStream &readBytes(char *&, uint &len) | 自动读取长度和内容,适用于字符串数据的读取 |
1.2.1、stm文件读写
1.2.1.1、写入stm
1)创建QFile对象,调用open()打开文件
2)创建QDataStream对象与QFile对象关联
3)setVersion()设置流版本号
4)按照需要保存数据的顺序使用<<写入文件流QDataStream(qintX,qreal、字符串,除了可以写入基本的数据类型外,还可以写入很多其他类型的数据,如QBrush、QColor、QImage、QIcon等,这些称为可序列化的数据类型)
5)调用close()关闭
1.2.1.2、读取stm
1)调用QFileDialog::getOpenFileName()获取文本路径
2)调用exists()判断文件是否存在
3)调用open()打开
4)创造QDataStream对象与QFile对象关联
5)setVersion()设置流版本号
6)使用>>的读取内容
7)调用close()关闭
1.2.2、dat文件读写
1.2.2.1、写入dat
*1)调用toUtf8()将QString转换为QByteArray;
2)创建QFile对象,调用open()打开文件
3)创造QDataStream对象与QFile对象关联
4)setByteOrder(QDataStream::LittleEndian)设置小字节序
5)调用writeRawData()将数据写入数据流或writeBytes()写入字符串数据
6)调用close()关闭
1.2.2.2、读取dat
1)调用QFileDialog::getOpenFileName()获取文本路径
2)调用exists()判断文件是否存在
3)调用open()打开
4)创造QDataStream对象与QFile对象关联
5)使用readRawData()的读取数据流或readBytes()读取字符串
6)调用close()关闭
2、文件目录
QCoreApplication | 用于提取应用程序路径、程序名等文件信息 |
QFile | 除了打开文件操作外,还有复制文件、删除文件功能 |
QFileInfo | QFileInfo |
QDir | 提取目录或文件信息,获取一个目录下的文件或目录列表,创建或删除目录和文件,文件重命名等操作 |
QTemporaryDir | 用于创建临时目录和临时文件 |
QTemporaryFile | |
QFileSytemWatcher | 文件和目录监听类,监听目录下文件的添加、删除等变化,监听文件修改变化 |
2.1、QCoreApplication
QCoreApplication是为无GUI应用提供时间循环的类,是所有应用程序类的基类,其子类QCuiApplication为有GUI界面的应用程序提供流控制和主要的设定,QCuiApplication的子类QApplication为基于QWidget的应用程序提供支持,包括界面的初始化等
QString applicationDirPath() | 返回应用程序启动路径 |
QString applicationFilePath() | 返回应用程序的带有目录的完整文件名 |
QString applicationName() | 返回应用程序名称,无路径无后缀 |
QStringList libraryPaths() | 返回动态加载库文件时,应用程序搜索的目录列表 |
void setOrganizationName(QString &orgName) | 为应用程序设置一个机构名 |
QString organizationName() | 返回应用程序的机构名 |
void exit() | 退出应用程序 |
2.2、QFileInfo类
QFileInfo类提供文件的各种信息。
void setFile(const QString &file) | 设置一个文件名,作为QFileInfo操作的文件 |
QString absoluteFilePath() | 返回带有文件名的绝对文件路径 |
QString absolutePath() | 返回绝对文件路径,不带文件名 |
QString fileName() | 返回去除路径的文件名 |
QString filePath() | 返回包含文件名的路径 |
QString path() | 返回不含文件名的路径 |
qint64 size() | 返回文件大小,以字节为单位 |
QString baseName() | 返回文件基名,第一个”.“之前的文件名 |
QString completeBaseName() | 返回文件基名,最后一个”.“之前的文件名 |
QString suffix() | 最后一个”.“之后的后缀 |
QString completeSuffix() | 第一个”.“之后的后缀 |
bool isDir() | 判断当前对象是否是一个目录或目录的快捷方式 |
bool isFile() | 判断当前对象是否是一个文件或文件的快捷方式 |
bool isExecutable() | 判断当前文件是否为可执行文件 |
QDateTime created() | 返回文件创建时间 |
QDateTime lastModified() | 返回文件最后一次被修改的时间 |
QDateTime lastRead() | 返回文件最后一次被读取的时间 |
bool exits() | 判断文件是否存在 |
静态函数 | |
bool exits(QString &FILE) | 判断文件是否存在 |
2.3、QDir类
静态函数 | |
QString tempPath() | 返回临时文件目录名称 |
QString rootPath() | 返回根目录名称 |
QString homePath() | 返回主目录名称 |
QString currentPath() | 获取当前路径 |
bool setCurrent(QString &path) | 设置path表示的目录为当前目录 |
QFileInfoList drives | 返回系统的根目录列表,在Windows上返回的是盘符列表 |
成员函数 | |
QString absoluteFilePath(QString &fileName) | 返回当前目录下的一个文件的含绝对路径文件名 |
QString absolutePath() | 返回当前目录的绝对路径 |
QString canonicalPath() | 返回当前目录的标准路径 |
QString dirName() | 返回最后一级目录的名称 |
QStringList entryList(Filters filters = NoFilter,SortFlags sort = NoSort) | 返回目录下的所有文件名、子目录名等 |
bool mkdir(QString &dirName) | 在当前目录下创建一个目录 |
bool rmdir(QString &dirName) | 删除指定的目录dirName |
bool remove(QString &fileName) | 删除当前目录下的文件fileName |
bool rename(QString &oldName,QString &newName) | 将文件或目录oldName更名为newName |
void setPath(QString &path) | 设置QDir对象的当前目录 |
void removeRecursively() | 删除当前目录及其下面的所有文件 |
2.4、QTemporaryDir和QTemporaryFile
2.4.1、QTemporaryDir
QTemporaryDir是创建、删除临时目录的类。
void setAutoRemove(bool) | 设置为是否自动删除 |
QString path() | 返回创建的临时目录名称 |
bool remove() | 删除此临时目录以及下面的所有文件 |
QTemporaryDir会在系统临时目录,即QDir::tempPath目录下创建一个临时目录,临时目录名称以QCoreApplication::applicationName()为前缀,后加6个字符。
2.4.2、QTemporaryFile
QTemporaryFile是创建、删除临时文件的类。临时文件保存在系统临时目录下。临时文件名称以QCoreApplication::applicationName()作为文件名,以”XXXXXX“6个随机数字作为文件后缀
void setAutoRemove(bool) | 设置为是否自动删除 |
bool open() | 用于打开临时文件,只有打开临时文件,才实际创建了此文件 |
2.5、QFileSystemWatcher
QFileSystemWatcher是对目录和文件进行监听的类。
bool addPath(QString &path) | 添加一个监听的目录或文件 |
QStringList addPaths(QStringList &paths) | 添加需要监听的目录或文件列表 |
QStringList diretores() | 返回监听的目录列表 |
QStringList filse() | 返回监听的文件列表 |
bool removePath(QString &path) | 移除监听的目录或文件 |
QStringList removePaths(QStringList &paths) | 添加需要监听的目录或文件列表 |
信号 | |
void QFileSystemWatcher::directoryChanged(const QString &path) | 目录变化发射的信号 |
void QFileSystemWatcher::fileChanged(const QString &path) | 文件变化发射的信号 |
3、解决中文乱码问题
为解决Unicode的识别问题,可以在应用程序中做全局的设置,使得应用程序支持Unicode。方法是使用QTextCodec类进行编码设置。
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodeForLocale(codec );