简介

QT中的IO操作通过统一的插口简化了文件与外部设备的操作方法,QT中文件被当成一种特殊的外部设备,文件操作与外部设备操作相同。IO操作的本质是连续储存空间的数据读写。

1.IO设备的类型

次序存取设备:只能从头开始次序读写数据,不能指定数据的读写位置

随机存取设备:可以定位到任意位置进行数据的读写

linux 日志切割脚本_linux 切割文件_linux 文件切割

2.QFile

在Qt帮助文档上面,倘若直接查询QFile帮助文档,看不到几个关于文件读写的函数,由于Qt将读写操作都封装在泛型QIODevice上面:

QIODevice类是对输入输入设备的具象建模,涉及到读写的文件类QFile、网络收发QTcpSocket/QUdpSocket、进程输入输出QProcess,都是从QIODevice类派生的。QIODevice是十分重要的子类,之后提到网路收发和进程类时就会再讲,本节主要关注与文件读写相关的插口函数。

QFileDevice是对文件设备的具象,虽然在Unix和Linux系统中所有东西都是文件设备,就连硬件设备也具象成文件设备,例如/dev/usb0是代表USB设备的文件,QFileDevice就是描述文件设备的类,QFileDevice这一层泛型的插口函数比较少,可以不用管的。

QFile类就是本节的学习重点,此后渐渐讲解。一齐从QFileDevice派生的还有个QSaveFile,这个保存文件类,就为了安全地保存文件而设计的,由于程序运行时可能有bug造成崩溃,假如崩溃时正在写入文件,这么文件被改写了一部份,但又没更改完全,会造成原始文件的毁坏。QSaveFile就是为了解决文件的不安全读写,防止出现半吊子问题,QSaveFile有两个重要函数:cancelWriting()函数取消写入操作,commit()递交所有写入操作,晓得QSaveFile有这两个函数就差不多了,由于也没其他重要功能。QSaveFile类不单独讲了,由于就那两个重要函数而已。下边开始学习QFile类。

linux 日志切割脚本_linux 文件切割_linux 切割文件

【领更多QT学习资料,点击下方链接免费发放↓↓,先码住不走失~】

点击→领取「链接」

2.1QFile功能函数

在多数情况下,QFile都是配合QTextStream和QDataStream使用,其实也可以使用QFile自带的读写函数处理文件。QFile除了适宜于普通的文件系统,并且对Qt程序内嵌的资源文件也是通用的,区别只是内嵌资源文件全是只读的。下边大致分几块来介绍QFile的功能函数:

(1)构造函数和打开函数

QFile一般在构造函数里指定须要打开的文件名:

QFile(const QString & name)
QFile(QObject * parent)
QFile(const QString & name, QObject * parent)

参数name就是须要打开的文件名,注意必须是实际的文件路径,不能是只有文件夹路径。parent是父对象表针。对于第二个构造函数,没有指定文件名,必须在以后的代码里用如下函数设置文件名:

void QFile::setFileName(const QString & name)

设置了文件名以后才会打开文件进行读写。获取文件名就用fileName()函数,不单独列了。

可以使用多种模式打开文件,例如只读模式、只写模式、读写模式等,最常用的打开函数为:

bool QFile::​open(OpenMode mode)

OpenMode枚举类型是在泛型QIODevice定义的,有如下打开模式:

OpenMode枚举常量

数值

描述

QIODevice::NotOpen

0x0000

用于表示设备或文件仍未打开。

QIODevice::ReadOnly

0x0001

按读取模式打开。

QIODevice::WriteOnly

0x0002

按写入模式打开,注意单独用这个模式会参杂Truncate。

QIODevice::ReadWrite

ReadOnly|WriteOnly

按读取和写入模式打开,既能读也能写。

QIODevice::Append

0x0004

按追加模式打开,文件先前存在的内容不会被覆盖,新数据从文件末尾开始写入。

QIODevice::Truncate

0x0008

强制清空文件里曾经存的旧数据,新数据从零开始写入。

QIODevice::Text

0x0010

在读取时,把行尾结束符更改为'n';在写入时,把行尾结束符更改为本地系统换行风格,例如Windows文本换行是"rn"

QIODevice::Unbuffered

0x0020

忽视缓冲区,直接读写设备或文件。除非是实时性很强的程序,否则用不到。

文件读取时,常见组合如下边两句:

file.open(QIODevice::ReadOnly);    //以只读方式打开文件
file.open(QIODevice::ReadOnly | QIODevice::Text);    //确定是读取文本文件,并且自动把换行符修改为 'n'

注意以QIODevice::Text模式打开文件时,读写的数据不一定是原始数据,由于QFile手动把换行符做了转换,读取得到的缓冲区数据与原始文件是可能不一样的,例如Windows文本,换行符是"rn"两个字符,用QIODevice::Text读取时只会听到'n'一个字符;写入时就反过来,代码写入一个'n',实际文件就是两个连续字符"rn",所以要注意QIODevice::Text模式读写的不一定是原始数据。

对于文件写入时,其常用打开模式如下:

file.open(QIODevice::WriteOnly);    //以只写模式打开,这个模式暗含 Truncate,会清空旧数据
file.open(QIODevice::WriteOnly | QIODevice::Truncate);    //只写模式,清空旧数据
file.open(QIODevice::WriteOnly | QIODevice::Append);     //只写和追加模式,不会清空旧数据

假如文件打开时既要读,又要写,这么建议用如下模式:

file.open(QIODevice::ReadWrite);    //读写模式,旧数据不会清空,可以读出来

文件打开以后,可以用从QIODevice承继来的读写函数操作文件,或则用QFile对象表针构造QTextStream或QDataStream来读写文件。

不仅里面最常用的打开函数,另外还有两个不太常用的打开函数:

bool QFile::​open(FILE * fh, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
bool QFile::​open(int fd, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)

里面第一个不常用打开函数可以打开标准输入流stdin、标准输出流stdout、标准错误流stderr,或则其他文件句柄(Windows系统中参数里的fh句柄必须以二补码模式打开,打开句柄时要带'b'模式)。最后的参数handleFlags通常就用不关掉的DontCloseHandle就可以了,若果希望QFile对象析构时手动关掉文件或流,这么可以用QFileDevice::AutoCloseHandle。

对于Windows平台,假如希望在图形界面程序上面用标准的输入输出和错误流,这么必须在项目文件加一句:

CONFIG+=console

里面第二个不常用open()函数是以fd文件描述符参数,与C语言上面的文件读写用到的文件描述符类似,假如fd为0是标准输入流,为1是标准输出流,为2是标准错误流。

open()函数打开正确就返回true,否则返回fasle,注意判定该函数的返回值,之后再进行文件读写操作!

(2)读写函数

本小节主要介绍从QIODevice承继而至的读写函数,这种函数要在QIODevice类帮助文档才会找到。

首先是简单的字节读写函数:

bool QIODevice::​getChar(char * c)

参数表针c就是读取的一个字节即将存到的变量表针,程序员须要自己先定义一个char变量,把这个变量地址传递给​getChar()函数,假若读取一字节成功就返回true;假如之前早已到了文件末尾,没有字节可以读了,就返回false。​getChar()函数有一个逆操作函数:

void QIODevice::​ungetChar(char c)

这个函数就是把之前读取的字节c(此次是变量,不是表针)放回家,但是当前读取游标减一,还原到读取之前状态。注意,假若c字节不等于之前读取的字节数值,这么​ungetChar()函数操作结果未能预知,所以不要使用​ungetChar()函数更改文件!

写入一个字节到文件中,应当使用函数:

bool QIODevice::​putChar(char c)

这个函数会把字节c写入文件,并将文件游标加一。

这儿我们专门讲一下文件游标,文件在读写时,共同使用一个惟一的游标(QFile内部有),我们这儿随意取个名子叫pos(Position),这个pos在文件刚打开时通常处于文件开头位置:

linux 日志切割脚本_linux 文件切割_linux 切割文件

说明一下,文件的大小是用size()函数获取的:

qint64 QFile::​size() const

文件大小使用qint64类型变量保存的,也就是说QFile最大支持2^63-1==9,223,372,036,854,775,807字节的文件,所以不用操劳QFile对大文件的支持特点。

QFile当前游标可以用函数获取:

qint64 QFileDevice::​pos() const

对于按字节读取的函数​getChar(),每调用一次,文件游标就加1,假如连续调用了N次,游标pos都会联通到右图所示位置:

linux 切割文件_linux 文件切割_linux 日志切割脚本

之前介绍的​getChar()、​putChar(),假如读写正确就会使pos手动加1,ungetChar()函数假如操作正确,这么会使pos手动减一,这个游标都是QFile手动控制,通常不须要自动联通游标。

【领更多QT学习资料,点击下方链接免费发放↓↓,先码住不走失~】

点击→领取「链接」

我们对文件读取到一定程度,都会读到文件末尾位置,抵达末尾以后就难以再读数据了,由于游标早已超出范围:

linux 日志切割脚本_linux 文件切割_linux 切割文件

QFile子类有快捷函数判定文件游标是否已抵达文件末尾:

bool QFileDevice::​atEnd() const

对于字节读取函数,文件游标是按一字节联通的,假如要读取大段数据块,这么可以使用下边的函数:

qint64 QIODevice::​read(char * data, qint64 maxSize)

data一般是程序员自动分配的缓冲区linux 文件切割,例如char*buff=newchar[256];

maxSize就是最多读取的字节数量,通常是自动分配的缓冲区大小,例如256。

该函数返回值通常就是正确读取的字节数量,由于假如文件前面若果没有256字节,这么有几个字节读几个字节。

假如read()函数在读取之前就到了文件末尾或则读取错误,这么返回值是-1。对于使用QIODevice::WriteOnly只写模式打开的文件,一般文件游标总是指向文件末尾,这时侯调用read()没意义,所以read()返回值就是-1。

自动分配缓冲区虽然是比较麻烦的事情,我们Qt原生态的读取函数应当用下边这个:

QByteArray QIODevice::​read(qint64 maxSize)

这儿的read()函数会把读取的字节字段存到QByteArray对象并返回,参数里的maxSize就是最多读取的字节数量。返回的QByteArray对象上面,可以用QByteArray自己的QByteArray::​size()函数判定读了多少字节,假如文件前面没字节可读或读取错误,这么QByteArray规格就是0。

QByteArray QIODevice::​readAll()

readAll()函数看名子就晓得,把文件的全部内容直接读取到QByteArray对象之后返回。

另外还有两个更实用的读取行的函数:

qint64 QIODevice::​readLine(char * data, qint64 maxSize)
QByteArray QIODevice::​readLine(qint64 maxSize = 0)

第一个​readLine()是程序员自动分配缓冲区,第二个不须要自动分配缓冲区。

readLine()函数工作特点比较特殊,它是从文件或设备上面读取一行ASCII字符,最多读取maxSize-1字节,由于最后一个字节预留给字符串结尾NULL字符。

该函数返回值是真实读取的字节数量,假如读取出错或无数据可读就返回-1。

​readLine()总会在实际读取的字符串末尾会手动添加一个字符串终结符0。

​readLine()会仍然读取数据直至如下三个条件之一满足:

①第一个'n'字符读取到缓冲区。

②maxSize-1字节数已读取,最后一个字节预留给0。

③文件或设备读取早已到末尾。

对于第一个中止条件,真实读取到了'n'字符,这么这个换行字符会填充到缓冲区上面;

对于第二个和第三个中止条件,是没有读到'n'字符,这么该函数不会手动添加换行符到末尾。

还有一个特殊情况要注意,readLine()函数会把Windows的文件换行风格"rn"手动替换改为'n'。

​read()和readAll()、​readLine()函数就会联通文件游标,具体是看真实读了多少字节。

以上主要是读操作,写操作不仅putChar(),还有如下三个写函数:

qint64 QIODevice::​write(const char * data, qint64 maxSize)

data就是缓冲区数据表针qq linux,maxSize是最多写入的字节数。返回值是真实写入的字节数,由于可能出现c盘不够的情况。假如返回值是-1,这么可能是写入出错或则无写入权限。这个写函数不分辨data缓冲区上面的''字符和普通字符串字符,都一股脑写进去。

qint64 QIODevice::​write(const char * data)

这第二个函数参数没指定缓冲区大小,会将参数里的data当成''结尾的普通字符串,写入该字符串。这个函数等价于下边这句代码:

QIODevice::write(data, qstrlen(data));

第三个写函数虽然更常用:

qint64 QIODevice::​write(const QByteArray & byteArray)

byteArray上面有多少字节就写入多少,这个也是不分辨''字符和普通字符串字符,都一股脑写进去。

写操作函数也就会联通文件游标pos,具体是看实际写入了多少字节。

linux 日志切割脚本_linux 文件切割_linux 切割文件

通常我们都不须要自动控制文件游标pos,而且假如有特殊情况,须要自动移游标,这么通过下边函数:

bool QFileDevice::​seek(qint64 pos)

​seek函数若果成功联通游标,这么会返回true,否则返回false。最好不要用seek函数联通游标到超出文件规格的位置,这样会造成难以意料的结果。

假如希望设置文件规格,提早在c盘上分配空间,可以用如下函数:

bool QFile::​resize(qint64 sz)

参数sz就是新的文件大小,假若新大小比旧的大,这么新增空间内容是随机的,须要程序员之后自动填充数据。重置大小成功就返回true,否则返回false。

文件打开和读写操作结束以后,就可以关掉文件:

void QFileDevice::​close()

在写操作过程中,假如须要立刻把Qt内部写缓冲区的数据写入c盘,可以调用:

bool QFileDevice::​flush()    //这个函数很少用到,文件关闭时自动会执行 flush

(3)文件属性和权限等函数

QFile有部份函数显然与QFileInfo类功能差不多,这儿大致讲解一下,对于这部份操作,虽然更建议用QFileInfo或QDir类来实现。

bool QFile::​copy(const QString & newName)

把当前文件复制到新文件newName,复制成功就返回true,否咋返回false。

注意假如newName新文件之前早已存在,这么copy()函数返回false,它不会覆盖旧文件。

当复制文件时,源文件手动会被关掉,之后使用源文件最好再重新打开。

bool QFile::​exists() const

判定当前文件是否存在。

bool QFile::​link(const QString & linkName)

为当前文件创建一个新的快捷方法linkName,创建成功返回true,创建失败返回false。​link()函数也不会覆盖之前已存在的快捷方法。对于Windows系统,快捷方法名必须以.lnk结尾,否则会出错。

bool QFile::​remove()

删掉当前文件,删掉之前文件会手动被关掉,之后删掉。

bool QFile::​rename(const QString & newName)

把当前文件重命名为新名子newName,若果成功返回true,失败返回false。假如newName文件之前已存在,这么重命名会失败,旧文件不会被覆盖。文件重命名之前,该文件也会手动关掉。

QString QFile::​symLinkTarget() const

假如当前文件是快捷方法文件,这么​symLinkTarget()返回原始文件的完整路径文件名linux 文件切割,否则返回空字符串。

Permissions QFile::​permissions() const
bool QFile::​setPermissions(Permissions permissions)

获取和设置文件权限的函数,Permissions枚举变量与7.1.3QFileInfo类的权限枚举是一样的。

(4)QFile类静态函数

有好几个静态函数与前面(3)里的函数重名,只是参数一般比前面同名函数多一个,多的参数是源文件名,这儿就不列出了。

静态函数上面,有三个与前面内容不重复的:

QString QFile::​decodeName(const QByteArray & localFileName)
QString QFile::​decodeName(const char * localFileName)

这两个文件名解码函数把操作系统本地化的路径文件名转为Qt标准的QString路径文件名(路径分隔符是'/')。

其实也有文件名编码函数:

QByteArray QFile::​encodeName(const QString & fileName)

这个函数把Qt标准的QString文件名编码称为操作系统本地化的路径文件名。

关于QFile类的功能函数介绍到这,下边来瞧瞧示例。

读文件

QFile file("./student.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    qDebug() << "文件打开失败";
    return;
}
//file.seek(0);//移动文件指针到开头
while (!file.atEnd())
{
    qDebug() << QString(file.readLine());  //读取文件中一行
    //qDebug() << QString(file.readAll()); //读取文件中所有内容
}

QIODevice::Text标志告诉Qt将windows风格的行中止符("rn")转换为c++风格的中止符("n")。默认情况下,QFile假定为二补码,即它不会对储存在文件中的字节执行任何转换。

写文件

QFile file("./what.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
    qDebug() << "文件打开失败";
    return;
}
file.write("大家好,我是xxx");

更改.txt文件中内容(读文件与写文件)

QString strAll;
    QStringList strList;
    QFile readFile("C:/Users/Administrator/Desktop/r.txt");//自定义读取文件的路径
    if(readFile.open((QIODevice::ReadOnly|QIODevice::Text)))
    {
        QTextStream stream(&readFile);
        strAll = stream.readAll();//把文件所有信息读出来保存到strAll中
    }
    readFile.close();
    QFile writeFile("C:/Users/Administrator/Desktop/w.txt");//是自定义写文件的路径
    if(writeFile.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        QTextStream stream(&writeFile);
        strList = strAll.split("n");//以换行符为基准分割文本,保存到strList中
        for(int i=0;i<strList.count();i++)//遍历每一行
        {
            if(strList.at(i).contains("flag"))//flag是要修改的内容
            {
                QString tempStr=strList.at(i);
                tempStr.replace(0,tempStr.length(),"Hello");//把flag替换成Hello
                stream<<tempStr<<'n';
            }
            //如果没有找到要替换的内容,照常写入
            else
            {
                if(i == strList.count()-1)//如果到了文件最后一行,不用加"n"
                {
                    stream<<strList.at(i);
                }
                else//否则每一行都加一个"n"
                {
                    stream<<strList.at(i)<<'n';
                }
            }
        }
    }
    writeFile.close();

临时文件

QTemporaryFile用于安全地创建惟一的临时文件

void tempFile()
{
    qDebug()<<QDir::tempPath();
    QTemporaryFile tempfile;
    if (!tempfile.open())
    {
        qDebug() << "打开失败"<<tempfile.errorString();
        return;
    }
    QTextStream stream(&tempfile);
    stream << "hello";
    qDebug() << tempfile.fileName();
}

3.流操作

在前面的读写文件中,我们发觉操作还是太过复杂,为了简化文本文件和数据文件的读写操作,QT提供了QTextStream和QDataStream辅助类。

QTextStream:可将写入的数据全部转换为可读文本,QDataStream:可将写入的数据按照类型转换为二补码数据。

3.1QTextStream(文本流)

标准C++有三个常见的输入输出流:iostream处理命令行输入输出、fstream处理文件输出输出、sstream处理显存字符串流的输入输出。一般将文本字符串转换成各类C++变量的过程是输入,把显存中C++变量表示成文本字符串的过程是输出。

Qt提供了强悍的文本流QTextStream,同时实现了三种C++输入输出流的功能,而且还有功能提高,支持各类文本字符编码。QTextStream通常用于操作各类编码格式的文本文件(QFile对象)或字符串(QString、QByteArray),也可以打开stdin、stdout和stderr命令行的输入输出,并手动处理本地化编码和Unicode编码。

QTextStream可以在QIODevice,QByteArray或QString上操作。使用QTextStream的流操作符,可以便捷地读和写词组,行和数字。对于生成文本,QTextStream支持数组填充和对齐的低格选项,以及数字的低格。

【领更多QT学习资料,点击下方链接免费发放↓↓,先码住不走失~】

点击→领取「链接」

3.1.1QTextStream构造函数和普研读写函数

一般情况下QTextStream自己不会主动去打开一个文件,所以它的构造函数不接收文件名,而是接收QFile子类QIODevice的表针,可以用QFile对象的表针构造QTextStream,但须要注意在构造QTextStream之前要调用QFile对象的open()函数按须要的模式打开文件并检测是否正确打开。

用于读写文件的QTextStream构造函数为:

 QTextStream(QIODevice * device)

设备表针device须要提早用open()函数打开。

对于文件设备,还有个不常用的构造函数:

 QTextStream(FILE * fileHandle, QIODevice::OpenMode openMode = QIODevice::ReadWrite)

fileHandle是文件句柄,由于Qt上面的文件通常都用QFile处理,所以几乎不会用这个第二个函数处理文件。第二个构造函数的用途主要是和命令行的stdin、stdout、stderr三个文件句柄协作,处理命令行的输入输出。

以上两个构造函数第一个用于文件读写(类似fstream),第二个通常用于命令行输入输出(类似iostream),而QTextStream第三个用途就是对显存字符串的低格输入和输出(类似sstream)。显存字符串输入输出,使用的构造函数为:

QTextStream(QString * string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
QTextStream(QByteArray * array, QIODevice::OpenMode openMode = QIODevice::ReadWrite)

QTextStream(const QByteArray & array, QIODevice::OpenMode openMode = QIODevice::ReadOnly)

注意后两个构造函数,假若传递QByteArray对象给构造函数,这么这个QByteArray对象是只读的。

假如传递QByteArray表针给构造函数,这么默认是可读可写的。

不仅可以在构造函数指定文件设备或显存字符串,还可以在运行时更改:

void QTextStream::​setDevice(QIODevice * device)
void QTextStream::​setString(QString * string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)

目前没有重新设置QByteArray的函数,只有更改文件设备和QString的函数。

我们这儿约定一下概念,无论QTextStream构造函数里是文件设备或显存字符串,本节前面都把QTextStream对象称为文本流。

假如我们须要从文本流提取各类C++基本数值类型,如short、int、long、double,这种读操作通常用7.3.2节的操作子和运算符来实现,写入文本流时也一样。流操作子和运算符之外的读写函数就是本小节说的普研读写函数。

读取一整行文本的函数:

QString QTextStream::​readLine(qint64 maxlen = 0)

QTextStream::​readLine()读取一行文本的时侯,返回字符串末尾剔除了换行符("n"或"rn"),而上一节QIODevice和QFile的readLine()函数返回字符串末尾带有一个"n",要注意分辨。

假如要读取文本流中所有内容,可以用快捷函数:

QString QTextStream::​readAll()

假如希望从文本流中读取指定宽度的文本,可以用函数:

QString QTextStream::​read(qint64 maxlen)

参数里是最多读取的字符数量,假如文本流里的数据不够,返回的字符串就是剩余的字符数。

在使用QFile对象表针构造QTextStream的时侯,一旦把QFile对象表针交给QTextStream以后,就不要再调用QFile对象自己的读写函数了,由于QTextStream使用自己缓存的文件游标,底层QFile对象自己又进行读写以后,两者的文件游标很可能不一致,会导致读写的混乱。既然使用QTextStream读写文件,那就只用QTextStream的读写函数或输入输出运算符。

QTextStream的文件游标(虽然应当叫文本流游标)可以用函数获取、移动,以及判定是否抵达文件末尾:

qint64 QTextStream::​pos() const    //获取游标位置
bool QTextStream::​seek(qint64 pos) //移动游标到 pos
bool QTextStream::​atEnd() const    //是否到达文 本流末尾

对于文本流的写入操作,QTextStream压根没有write()函数,写入操作全部是通过输出运算符>运算符进行输入,借助运算符就不一个个列出了,讲一下关于字符串读取的三个:

QTextStream & QTextStream::​operator>>(QString & str)
QTextStream & QTextStream::​operator>>(QByteArray & array)
QTextStream & QTextStream::​operator>>(char * c)

QTextStream对于字符串的读取,虽然只读取一个词组,而不是一整行。例如假如文本流原始为"Helloworld,aha!",假如用前面三个函数从头读取,这么读取的都只是第一个词组"Hello",在源头的文件或显存字符串中,文本流中间都没有字符串终结符'',所以QTextStream在输入时根据空白字符切割词组,每位词组算作一个小字符串返回。空白字符包括空格、制表符、换行符等等。

另外当文本流用>>读取挨个字符到QChar或char变量上面时,可以用

void QTextStream::​skipWhiteSpace()

跳过空白字符,倘若不跳过空白字符,这么QChar和char也会接收到空白字符,如空格、制表符、换行符等等。

对于字符串的输出就没有前面这些问题了,由于输出时可以明晰晓得参数里的QString、QByteArray、char*是以''结尾的,在''后面的字符串就会被写入到输出文本流中。

输出文本流须要注意的是QTextStream有较大的输出缓冲区,假如用stdout或stderr构造QTextStream对象复印输出,要常用flush或endl操作子函数清空缓存,及时显示输出:

tsOut<<flush;
tsOut<<endl;

flush和endl的区别是endl会换行,flush不换行。

流的输入输出运算符用上去比较简单,下边重点瞧瞧控制格式的操作子,操作子本质都是函数,例如常用的换行endl:

QTextStream & endl(QTextStream & stream)

我们这儿把QTextStream的操作子大致罗列并解释一下:

①数值的补码和符号、小数点

操作子

描述

bin

读写二补码整数,等同于setIntegerBase(2).

oct

读写八补码整数,等同于setIntegerBase(8).

dec

读写十补码整数,等同于setIntegerBase(10).

hex

读写十六补码整数,等同于setIntegerBase(16).

showbase

输出时显示数值补码前缀,例如"0x"、"0"、"0b",等同于setNumberFlags(numberFlags()|ShowBase).

forcesign

强制显示正号(负数和0后面),等同于setNumberFlags(numberFlags()|ForceSign).

forcepoint

强制显示整数末尾的小数点,等同于setNumberFlags(numberFlags()|ForcePoint).

noshowbase

不显示补码的前缀,等同于setNumberFlags(numberFlags()&~ShowBase).

noforcesign

不强制显示正号,等同于setNumberFlags(numberFlags()&~ForceSign).

noforcepoint

不强制显示小数点,等同于setNumberFlags(numberFlags()&~ForcePoint).

uppercasebase

数值补码的前缀为小写,如"0X"、"0B",等同于setNumberFlags(numberFlags()|UppercaseBase).

uppercasedigits

基数小于10补码的数值上面的字母小写,例如16补码的"FE00",等同于setNumberFlags(numberFlags()|UppercaseDigits).

lowercasebase

数值补码的前缀大写,如"0x"、"0b",等同于setNumberFlags(numberFlags()&~UppercaseBase).

lowercasedigits

基数小于10补码的数值上面的字母大写,例如16补码的"fe00",等同于setNumberFlags(numberFlags()&~UppercaseDigits).

②浮点数格式

操作子

描述

fixed

以定点数显示实数(例如float、double类型),例如1024.1234,等同于setRealNumberNotation(FixedNotation).

scientific

以科学计数法显示实数,例如1.0241234e3,等同于setRealNumberNotation(ScientificNotation).

qSetRealNumberPrecision(intprecision)

这是全局操作子,带一个整型参数,指定实数显示的精度位数,等同于QTextStream::setRealNumberPrecision(precision).

qSetRealNumberPrecision(int)会对后续所有实数变量输出都生效,直至被改变为止,实数精度默认是6位,假如希望还原就设置精度为6。注意使用操作子qSetRealNumberPrecision(int)时最好一块明晰指定使用fixed或则scientific,这样显示结果才是符合预期的小数位精度。

③域宽和对齐方法、填充字符

操作子

描述

qSetFieldWidth(intwidth)

全局操作子,带一个整型参数,设定变量输出后的显示长度,不足的用填充字符补足(默认用空格补),等同于QTextStream::setFieldWidth(width).

qSetPadChar(QCharch)

全局操作子,带一个字符参数,假如设置的域宽比变量显示须要的长度更宽,就用这个填充字符弥补(默认是空格''),等同于QTextStream::setPadChar(ch).

left

设定域宽比变量显示须要的更宽时,变量显示时左对齐,右侧空位补PadChar,等同于setFieldAlignment(AlignLeft).

right

设定域宽比变量显示须要的更宽时,变量显示时右对齐,右侧空位补PadChar,等同于setFieldAlignment(AlignRight).

center

设定域宽比变量显示须要的更宽时,变量显示时居中对齐,两侧空位补PadChar,等同于setFieldAlignment(AlignCenter).

注意:qSetFieldWidth(int)设置域宽以后,倘若不重新设置,它就仍然生效,对后续所有变量输出都好使,包括endl就会补足变为指定宽度。假如要还原成不设置域宽的状态,就调用操作子qSetFieldWidth(0)。

qSetPadChar(QChar)设置填充字符以后也是仍然持续生效,直至被重新设置,假如还原成空格,就调用操作子qSetPadChar(QChar(0x20))。

【领更多QT学习资料,点击下方链接免费发放↓↓,先码住不走失~】

点击→领取「链接」

④其他操作子

操作子

描述

endl

添加换行符并清空输出缓存,把缓冲数据都讲到输出文本流,等同于stream运算符重载函数,QDataStream提供了另外几个读写函数,可以用于读写自定义的数据块,首先是一对writeBytes()和readBytes()函数:

QDataStream & QDataStream::​writeBytes(const char * s, uint len) //变量 len 也会写入数据流
QDataStream & QDataStream::​readBytes(char *& s, uint & l)      //l数值是从数据流里读出来的,就是上面的 len

对于字节写入函数,参数里的s是要输出的字节缓冲区,len是写入数据的宽度,这儿s上面针对纯字节数据,不管上面有没有'',都写入数据流。

对于字节读取函数,s是表针变量的引用,l是读取的字节数,s表针不须要程序员分配空间,由​readBytes()函数自己new[]一段缓冲区,之后把缓冲区表针形参给s;参数l是函数的返回变量,是真实读取到的字节数。函数返回以后s表针变量指向的缓冲区需程序员自动delete[]。

​writeBytes()函数在做串行化时,会先写quint32类型的数据宽度,之后写入真实的缓冲区数据到数据流。​readBytes()也是先读取字节链表宽度,该函数自己new[]一片空间,把前面的真实数据读到缓冲区。

writeBytes()和​readBytes()函数与字符串读写运算符重载函数有类似的地方:

QDataStream & QDataStream::​operator<>(char *& s)

在做串行化时,都是先写一个quint32类型的宽度到数据流,之后写真实数据,读的时侯就是先读宽度,之后按照宽度new[]缓冲区,把数据读到缓冲区。这两对函数的区别就是writeBytes()和​readBytes()针对字节链表,不管是不是'',都当成普通字节读写;>读写字符串时遇见''就截至了,但是''不会写入到数据流。

QDataStream还提供了更裸的读写函数,下边这对读写函数是不把字节链表宽度变量写入到数据流的,仅仅写入原始的缓冲区数据:

int QDataStream::​writeRawData(const char * s, int len)
int QDataStream::​readRawData(char * s, int len)

这对函数与之前一对writeBytes()和​readBytes()函数区别有两点:第一,不写数据宽度变量到数据流,只读写最原始的数据块;第二,​readRawData()自己不会分配缓冲区,必须由程序员提早分配缓冲区给s,然后传递给readRawData()函数。

QDataStream与QTextStream也有类似的地方,就是流的状态,假如数据流的输入次序与输出次序不匹配,这么会出现状态错误,获取流的状态函数为:

Status QDataStream::​status() const

状态枚举类型也有四个:

Status枚举常量

数值

描述

QDataStream::Ok

0

正常操作状态,没出错。

QDataStream::ReadPastEnd

1

底层设备已抵达末尾,例如文件末尾,无数据可读了。

QDataStream::ReadCorruptData

2

读入了腐化数据,典型的就是输入流读取次序与输出流次序不一样。

QDataStream::WriteFailed

3

未能向底层设备写入数据,例如文件是只读的。

在QDataStream数据流出现错误状态以后,可以重新设置流的状态:

void QDataStream::​setStatus(Status status) //设置流为参数里执行的状态
void QDataStream::​resetStatus()         //重置为原始的 Ok 状态

linux 文件切割_linux 日志切割脚本_linux 切割文件

QDataStream流的排除处理就比较麻烦了,尽管可以跳过一定的裸字节数:

int QDataStream::​skipRawData(int len)

这个函数跳过最原始的裸数据len宽度的字节,返回值是真实跳过的字节数。这个函数可以与​readRawData()配合使用,并且在处理流错误时未必有用,由于跳过指定的字节数量然后,流的数据到哪种类型的变量或对象了,无法确定。QDataStream读取错误时,最好的做法是直接提示出错,前面的不读取,由于串行化数据流默认是不能随机化读写的。

QDataStream是使用Qt自己独有的串行化数据打包形式,它没有任何的格式操作子,由于输入输出格式全是外置的,但QDataStream有自己兼容的Qt版本号。随着Qt版本的更新,QDataStream打包数据的方法也会更新,因而QDataStream有一大堆兼容的版本号,从最早的Qt_1_0到最新的Qt_5_4,版本号枚举常量的命名规则就是Qt_大版本号_小版本号。

假如负责输出的程序与负责输入的程序,使用的Qt版本是一致的,就不须要设置版本号。并且假如输出和输入程序的Qt版本不一致,例如输出程序使用的是Qt4.8.*,输入程序使用的是Qt5.4.*,这么就应当向旧版本兼容,在做读取变量或对象之前,设置版本号:

void QDataStream::​setVersion(int v)

要兼容Qt4.8.*,这么就把参数设为QDataStream::Qt_4_8。

随着Qt版本号的更新,C++基本类型的变量读写规则是固定的,例如qint32就是读写4个字节,所以QDataStream版本号对C++基本类型变量读写虽然没影响。QDataStream版本号影响的是Qt自己类对象的读写规则,例如之后假如新增了一个类QXXXXData,这么只有新版本的Qt中QDataStream能够读写这个新类QXXXXData对象。

示例:

QByteArray data;
QDataStream stream(&data,QIODevice::ReadWrite);
stream << "image" << 1024 << "ABC";
//"[x00x00x00x06imagex00]   [x00x00x04x00]  [x00x00x00x04" "ABCx00"] 22
qDebug() << data << data.size();

使用QDataStream串行化数据,假如数据是字符串则会在上面用4个字节表明字符串宽度,倘若是整数则直接储存。

4.QFileInfo4.1简介

QFileInfo类提供与系统无关的文件信息,QFileInfo提供了关于文件的名称和在文件系统中的位置(路径)、它的访问权限以及它是目录还是符号链接等信息。文件的大小和最后更改/读取时间也可用。

4.2常用技巧

bool isDir() const               //.如果该对象指向目录或指向目录的符号链接,则返回true;否则返回false。
bool isFile() const              //.如果该对象指向文件或指向文件的符号链接,则返回true。如果对象指向的不是文件,比如目录,则返回false。
bool isHidden() const            //.如果这是一个“隐藏”文件,则返回true;否则返回false。
bool isSymLink() const           //.如果该对象指向符号链接,则返回true;否则返回false。
QString symLinkTarget() const    //.返回符号链接指向的文件或目录的绝对路径,如果对象不是符号链接,则返回空字符串。
QString suffix() const           //.返回文件的后缀(扩展名)。
QString completeSuffix() const   //.返回文件的完整后缀(扩展名)。 
QString fileName() const         //.返回文件的名称(不包括路径)。
QString baseName() const         //.返回文件的基本名称,不包含路径。
QString filePath() const         //.返回文件名,包括路径(可以是绝对的或相对的)。
QString absoluteFilePath() const //.返回包含文件名的绝对路径。
QString path() const             //.返回文件的路径。这不包括文件名。
qint64 size() const              //.以字节为单位返回文件大小。如果文件不存在或无法获取,则返回0。
QDateTime birthTime() const      //.返回文件创建/生成的日期和时间。
QDateTime lastModified() const   //.返回文件最后修改的日期和本地时间。

示例:

QFileInfo info(file);
QFileInfo info("../QFile-test/what.txt");
qDebug() << info.size();         //文件大小
qDebug() << info.absoluteFilePath(); //文件绝对路径(包括文件名)
qDebug() << info.absolutePath();     //绝对路径(不包括文件名)
qDebug() << info.absoluteDir();      //绝对路径 QDir
qDebug() << info.path();             //文件路径
qDebug() << info.filePath();         //返回文件名,包括路径(可以是绝对路径也可以是相对路径)。  
if(info.is)
if (info.isFile()) //如果是文件
{
    qDebug() << info.fileName(); //带后缀的文件名
    qDebug() << info.baseName(); //不带后缀的文件名
    qDebug() << info.suffix();   //获取文件后缀
}

5.QDir5.1简介

QDir类提供对目录结构及其内容的访问。

QDir用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它也可以拿来访问Qt的资源系统。

Qt使用“/”作为通用目录分隔符,如同在url中使用“/”作为路径分隔符一样。倘若您总是使用“/”作为目录分隔符,Qt将转换您的路径以符合底层操作系统。

QDir可以使用相对路径或绝对路径指向文件。绝对路径以目录分隔符开始(在Windows下,可以在上面加上驱动器规范)。相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。

5.2QDir功能

(1)、目录分隔符统一使用’/’

(2)、能够对目录进行任意操作(创建、删除、重命名)

bool mkdir(const QString &dirName) const
bool mkpath(const QString &dirPath) const
        
bool rmdir(const QString &dirName) const    //删除子目录(必须为空才能删除)
bool rmpath(const QString &dirPath) const   //删除路径(必须为空才能删除)
bool remove(const QString &fileName)        //删除指定文件
bool removeRecursively()                    //删除目录,包括它的所有内容 
bool rename(const QString &oldName, const QString &newName) //重命名

(3)、能够获取指定目录中的所有条目(文件和文件夹)

QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const

(4)、获取常用路径

//返回应用程序当前目录的绝对路径
QDir current()
QString currentPath()
//返回用户主目录  C:/Users/Maye
QDir home()
QString homePath()
 
//返回系统的临时目录。   
QDir temp()
QString tempPath()
    
//返回根目录列表 C:/  D:/ ...
QFileInfoList drives()

(5)、计算目录的大小

quint32 dirSize(const QString& dirName)
{
    QDir dir(dirName);
    if (!dir.exists())
        return ~0;
    quint32 size = 0;
    for (QFileInfo& info : dir.entryInfoList(QDir::Filter::NoDotAndDotDot | QDir::Files | QDir::Dirs))
    {
        qDebug() << info.fileName();
        if (info.isFile())
        {
            size += info.size();
        }
        else
        {
            size += dirSize(info.filePath());
        }
    }
    return size;
}

【领更多QT学习资料,点击下方链接免费发放↓↓,先码住不走失~】

点击→领取「链接」

6.QFileSystemWatcher6.1简介

QFileSystemWatcher类用于提供监视文件和目录更改的插口。

QFileSystemWatcher通过监控指定路径的列表,监视文件系统中文件和目录的变更。

调用addPath()函数可以监控一个特定的文件或目录。假如须要监控多个路径,可以使用addPaths()。通过使用removePath()和removePaths()函数来移除现有路径。

QFileSystemWatcher检测添加到它的每位路径,已添加到QFileSystemWatcher的文件可以使用的files()函数进行访问,目录则使用directories()函数进行访问。

当一个文件被更改、重命名或从c盘上删掉时,会发出fileChanged()讯号。同样,当一个目录或它的内容被更改或删掉时,会发射directoryChanged()讯号。须要注意:文件一旦被重命名或从硬碟删掉,目录一旦从c盘上删掉,QFileSystemWatcher将停止监控。

注:监控文件和目录进行更改的行为会消耗系统资源。这意味着,你的进程同时监控会有文件数目的限制。一些系统限制打开的文件描述符的数目默认为256。也就是说,假如你的进程试使用addPath()和addPaths()函数添加超过256个文件或目录到文件系统将会失败。

6.2公有函数

QFileSystemWatcher(const QStringList &paths, QObject *parent = nullptr)
QFileSystemWatcher(QObject *parent = nullptr)

bool  addPath(const QString &path)
QStringList addPaths(const QStringList &paths)

QStringList directories() const
QStringList files() const

bool removePath(const QString &path)
QStringList removePaths(const QStringList &paths)

6.3讯号

void directoryChanged(const QString &path)
void fileChanged(const QString &path)

示例:

来实现一个文件/目录监控类型。

#include 
#include 
#include 
#include 
#include 

#include class FileWatcher : public QObject { Q_OBJECT public: FileWatcher():mFileWatcher(new QFileSystemWatcher(this)) { connect(mFileWatcher, &QFileSystemWatcher::directoryChanged, this, &FileWatcher::onDirChanged); connect(mFileWatcher, &QFileSystemWatcher::fileChanged, this, &FileWatcher::onFileChanged); }; void addWatcherPath(const QString&path) { //把每个目录和文件都添加监视 mFileWatcher->addPath(path); //如果监视的是目录,则把目录中的项保存起来 if(QFileInfo(path).isDir()) mCurContentsMap.insert(path,QDir(path).entryList(QDir::Filter::NoDotAndDotDot | QDir::Dirs | QDir::Files)); ​ //遍历子项 QDir dir(path); for(QString ph : dir.entryList(QDir::Filter::NoDotAndDotDot | QDir::Dirs | QDir::Files)) { if(QFileInfo(ph).isFile()) { mFileWatcher->addPath(ph); } else //目录 { addWatcherPath(ph); } } } ​ public slots: void onDirChanged(const QString& path) { qDebug() << path << "dirChanged"<directories(); //获取目录下所有项列表 auto curEntryList = QDir(path).entryList(QDir::Filter::NoDotAndDotDot | QDir::Dirs | QDir::Files); ​ //获取目录下原来项的列表 auto oldEntryList = mCurContentsMap[path]; ​ //qDebug()<<"curEntryList"<<curEntryList; //qDebug()<<"oldEntryList"<<oldEntryList; ​ ​ //把curEntryList和oldEntryList转成集合set QSet curDirSet(curEntryList.begin(),curEntryList.end()); QSet oldDirSet(oldEntryList.begin(),oldEntryList.end()); ​ ​ //更新设置 mCurContentsMap[path] = curEntryList; ​ //判断是否修改了文件:如果新老集合大小相等,说明只是文件名改变了 if(curDirSet.size() == oldDirSet.size()) { auto modifyDir = curDirSet - oldDirSet; if(!modifyDir.isEmpty()) { //对修改的文件进行操作 qDebug()<<"修改"< oldDirSet.size()) { auto addDir = curDirSet - oldDirSet; if(!addDir.isEmpty()) { //对添加的文件进行操作 qDebug()<<"添加"<<a style='color:#0000CC;' ddDir; } ​ } //判断是否删除了文件 else if(curDirSet.size() < oldDirSet.size()) { auto delDir = curDirSet - oldDirSet; if(!delDir.isEmpty()) { //对删除的文件进行操作 qDebug()<<"删除"<<delDir; } } } void onFileChanged(const QString& file) { qDebug() << file << "fileChanged"; ​ QFileInfo info(file); QString strPath = info.absolutePath(); QString strName = info.fileName(); ​ qDebug() << QString("The file %1 at path %2 is updated").arg(strName).arg(strPath); } private: QFileSystemWatcher *mFileWatcher; QMap mCurContentsMap; //每个监控路径对应的列表 }; ​ ​ int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); ​ FileWatcher watcher; watcher.addWatcherPath("./"); ​ return a.exec(); } ​ #include"main.moc"

7.QStandardPaths7.1简介

QStandardPaths类提供了访问标准路径的技巧。所谓系统标准路径指的是本地文件系统中,用户的特定目录或系统的配置目录。例如在Windows系统中的“我的文档”,“视频”,“图片”等目录位置。

对于一个小型项目,系统的标准目录是保存数据,配置信息的一个特别有用的地方。比如,一个应用程序须要将下载好的文档保存在本地文件系统的某个地方,而它不能假定某个定好的路径是存在于c盘上的。有的人可能会将这个文档保存在应用程序所在的工作目录中,其实这是个好方式,但有时应用程序并不希望将数据放到工作目录中,这是由于:

对于系统标准目录,我们可以认定它是必然存在的(虽然不存在,也可手动创建),并且不同的操作系统,可能有不一样的系统标准目录。诸如“我的文档”目录位置

假如想要做跨平台的系统,像这种路径,你都得想办法获取,这只是一个我的文档,假如再加上“下载”,“图片”等标准路径,想想是不是都很麻烦。

但是,Qt却给我们提供了十分便捷的类来获取这种标准目录路径,它就是马上要学习的QStandardPaths类。所有函数均为静态函数。

7.2静态公有函数

(1)返回给定位置类型的本地化显示名称,假如找不到相关位置,则返回空QString。

参数列表中StandardLocationtype是一个枚举类型下边会解释所有类型

[static] QString displayName(QStandardPaths::StandardLocation type)

(2)在指定路径中查找名为executableName的可执行文件,假如路径为空则查找系统路径。

[static] QString findExecutable(const QString &executableName, const QStringList &paths = QStringList())

(3)在type的标准位置中查找名为fileName的文件或目录。

[static] QString locate(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = LocateFile)

(4)依据文件名fileName在type的标准位置查找所有文件或目录。

[static] QStringList locateAll(QStandardPaths::StandardLocation type, const QString &fileName, QStandardPaths::LocateOptions options = LocateFile)

(5)假如testMode为true,这将在QStandardPaths中启用一个特殊的“测试模式”红帽子linux,它将修改可写的位置以指向测试目录。这将制止手动测试读取或写入当前用户的配置。

[static] void setTestModeEnabled(bool testMode)

(6)返回该类型文件所属的所有目录。

[static] QStringList standardLocations(QStandardPaths::StandardLocation type)

(7)返回写入类型为文件的目录,倘若未能确定位置,则返回空字符串。

[static] QString writableLocation(QStandardPaths::StandardLocation type)

7.3enumQStandardPaths::StandardLocation

枚举常量

描述

QStandardPaths::DesktopLocation

0

返回用户的桌面目录。这是一个基类值。在没有桌面概念的系统上。

QStandardPaths::DocumentsLocation

1

返回包含用户文档文件的目录。这是一个基类值。返回的路径从来不是空的。

QStandardPaths::FontsLocation

2

返回包含用户字体的目录。这是一个基类值。注意,安装字体可能须要额外的、特定于平台的操作。

QStandardPaths::ApplicationsLocation

3

返回包含用户应用程序(可执行程序、应用程序包或它们的快捷方法)的目录。这是一个基类值。注意,安装应用程序可能须要额外的、特定于平台的操作。该目录中的文件、文件夹或快捷方法是特定于平台的。

QStandardPaths::MusicLocation

4

返回包含用户音乐或其他音频文件的目录。这是一个基类值。若果不存在专门用于音乐文件的目录,则返回一个用于储存用户文档的合理后备方案。

QStandardPaths::MoviesLocation

5

返回包含用户影片和视频的目录。这是一个类库值。若果不存在特定于影片文件的目录,则返回用于储存用户文档的合理的备用方案。

QStandardPaths::PicturesLocation

6

返回包含用户图片或相片的目录。这是一个基类值。若果没有特定的目录对于早已存在的图片文件,将返回储存用户文档的合理退步。

QStandardPaths::TempLocation

7

返回可以储存临时文件的目录。返回值可能是特定于应用程序的,在此用户的其他应用程序之间共享,甚至在系统范围内共享。返回的路径从来不是空的。

QStandardPaths::HomeLocation

8

返回用户的主目录(与QDir::homePath()相同)。在Unix系统上,这等于HOME环境变量。这个值可以是通用的,也可以是特定于应用程序的,并且返回的路径从来不是空的。

QStandardPaths::DataLocation

9

返回与AppLocalDataLocation相同的值。此枚举值已弃用。使用AppDataLocation更可取,由于在Windows上,推荐使用漫游路径。

QStandardPaths::CacheLocation

10

返回应当写入用户特定的非必要(缓存)数据的目录位置。这是一个特定于应用程序的目录。返回的路径从来不是空的。

QStandardPaths::GenericCacheLocation

15

返回应写入跨应用程序共享的特定于用户的非必要(缓存)数据的目录位置。这是一个基类值。注意,假若系统没有共享缓存的概念,则返回的路径可能为空。

QStandardPaths::GenericDataLocation

11

返回可储存跨应用程序共享的持久数据的目录位置。这是一个基类值。返回的路径从来不是空的。

QStandardPaths::RuntimeLocation

12

返回应当写入运行时通讯文件的目录位置,如Unix本地套接字。这是一个基类值。在个别系统上,返回的路径可能为空。

QStandardPaths::ConfigLocation

13

返回应当写入用户特定配置文件的目录位置。这可能是一个通用值或特定于应用程序的值,但是返回的路径永远不会为空。

QStandardPaths::DownloadLocation

14

返回用户下载文件的目录。这是一个基类值。假若不存在专门用于下载的目录,则返回用于储存用户文档的合理后备方案。

QStandardPaths::GenericConfigLocation

16

返回应当写入多个应用程序之间共享的用户特定配置文件的目录位置。这是一个基类值,返回的路径从不为空。

QStandardPaths::AppDataLocation

17

返回可储存持久应用程序数据的目录位置。这是一个特定于应用程序的目录。要获取储存要与其他应用程序共享的数据的路径,请使用QStandardPaths::GenericDataLocation。返回的路径从来不是空的。在Windows操作系统上,这将返回漫游路径。这个enum值是在Qt5.4中添加的。

QStandardPaths::AppLocalDataLocation

DataLocation

返回Windows操作系统的本地设置路径。在所有其他平台上,它返回与AppDataLocation相同的值。这个enum值是在Qt5.4中添加的。

QStandardPaths::AppConfigLocation

18

返回应当写入用户特定配置文件的目录位置。这是一个特定于应用程序的目录,返回的路径永远不会为空。这个enum值是在Qt5.5中添加的。

7.4使用方式

qDebug() << "DesktopLocation: " << QStandardPaths::displayName(QStandardPaths::DesktopLocation);
qDebug() << "DocumentsLocation: " << QStandardPaths::displayName(QStandardPaths::DocumentsLocation);
qDebug() << "FontsLocation: " << QStandardPaths::displayName(QStandardPaths::FontsLocation);
qDebug() << "ApplicationsLocation: " << QStandardPaths::displayName(QStandardPaths::ApplicationsLocation);
qDebug() << "MusicLocation: " << QStandardPaths::displayName(QStandardPaths::MusicLocation);
qDebug() << "MoviesLocation: " << QStandardPaths::displayName(QStandardPaths::MoviesLocation);
qDebug() << "PicturesLocation: " << QStandardPaths::displayName(QStandardPaths::PicturesLocation);
qDebug() << "TempLocation: " << QStandardPaths::displayName(QStandardPaths::TempLocation);
qDebug() << "HomeLocation: " << QStandardPaths::displayName(QStandardPaths::HomeLocation);
qDebug() << "DataLocation: " << QStandardPaths::displayName(QStandardPaths::DataLocation);
qDebug() << "CacheLocation: " << QStandardPaths::displayName(QStandardPaths::CacheLocation);
qDebug() << "GenericCacheLocation: " << QStandardPaths::displayName(QStandardPaths::GenericCacheLocation);
qDebug() << "GenericDataLocation: " << QStandardPaths::displayName(QStandardPaths::GenericDataLocation);
qDebug() << "RuntimeLocation: " << QStandardPaths::displayName(QStandardPaths::RuntimeLocation);
qDebug() << "ConfigLocation: " << QStandardPaths::displayName(QStandardPaths::ConfigLocation);
qDebug() << "DownloadLocation: " << QStandardPaths::displayName(QStandardPaths::DownloadLocation);
qDebug() << "GenericConfigLocation: " << QStandardPaths::displayName(QStandardPaths::GenericConfigLocation);
qDebug() << "AppDataLocation: " << QStandardPaths::displayName(QStandardPaths::AppDataLocation);
qDebug() << "AppLocalDataLocation: " << QStandardPaths::displayName(QStandardPaths::AppLocalDataLocation);
qDebug() << "AppConfigLocation: " << QStandardPaths::displayName(QStandardPaths::AppConfigLocation);

qDebug() << QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
qDebug() << QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);

7.5在指定位置查找文件

qDebug()<<QStandardPaths::findExecutable("calc.exe");	//只要设置了path环境变量,都可以找到
qDebug()<<QStandardPaths::findExecutable("7z.exe",QStringList()<<"D:\MySoftWare\7-Zip");	//如果没有设置path环境变量,可以自己指定多个路径

qDebug()<< QStandardPaths::locate(QStandardPaths::StandardLocation::DownloadLocation,"下拉.png");

8.QSettings8.1简介

用户一般希望应用程序在会话中记住它的设置(窗口大小和位置,选项等)。这种信息一般储存在Windows上的系统注册表中(HKEY_CURRENT_USERSoftware/MySoft),以及macOS和iOS上的属性列表文件中。在Unix系统上,在欠缺标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。

QSettings是对这种技术的具象,使您还能以可移植的方法保存和恢复应用程序设置。它还支持自定义储存格式。

QSettings的API基于QVariant,因而我们可以保存好多的类型,如QString、QRect和QImage。

倘若您所须要的只是一个非持久的基于显存的结构,这么可以考虑使用QMap代替。

8.2基本用法

创建QSettings对象时,必须传递公司或组织的名称以及应用程序的名称。诸如,假如你的程序名为QQ,而你的公司名为NiuBi,你将构造QSettings对象如下:

QSettings setting("NiuBi","QQ");

QSettings对象既可以在堆栈上创建,也可以在堆上创建(即使用new)。构造和销毁QSettings对象特别快。

假如你在应用程序的好多地方使用QSettings,你可能想要使用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()指定组织名称和应用程序名称,之后使用默认的QSettings构造函数:

QCoreApplication::setOrganizationName("NiuBi");
QCoreApplication::setOrganizationDomain("NiuBi.com");
QCoreApplication::setApplicationName("QQ");
...
QSettings settings;

QSettings储存设置。每位设置由一对(key,value)通配符对(key为QStirng类型,value为QVariant)组成。要写入设置,可以使用setValue()。比如:

setting.setValue("size",QSize(640,480));
qDebug()<< setting.fileName();  //获取配置文件保存位置

假如早已存在具有相同键的设置,则现有值将被新值覆盖。为了提升效率,修改可能不会立刻保存到永久储存中。(可以调用sync()来立刻递交修改。)

你可以使用value()获取设置的值:

QSize size =  setting.value("size",QSize(250,250)).value();

若果没有指定名称的设置,QSettings返回一个空的QVariant(无效的)。你可以通过传递第二个参数给value()来指定另一个默认值(这儿传了QSize(250,250),假如配置文件中没有size,就返回自己传的这个数据)。

配置文件格式

在windows下,默认为写入注册表,假如想要写入到.ini文件并保存到exe所在目录,该如何设置呢?

QApplication::setOrganizationName("NiuBi");
QApplication::setApplicationName("QQ");
​
QSettings setting(QApplication::applicationDirPath()+"/qfile.ini" ,QSettings::Format::IniFormat);

8.3公有函数常用

void setValue(const QString &key, const QVariant &value)

QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const

void QSettings::sync()

QSettings::Status status() const

void remove(const QString &key)

QString QSettings::fileName() const

分组

void beginGroup(const QString &prefix)

void endGroup()

QString QSettings::group() const

int beginReadArray(const QString &prefix)

void beginWriteArray(const QString &prefix, int size = -1)

void endArray()

void setArrayIndex(int i)

本文原创地址:https://www.linuxprobe.com/qzdicztgtydj.html编辑:刘遄,审核员:暂无