Qt:文件处理

68 篇文章 24 订阅
Qt提供了QFile类来进行文件操作。为了更方便的处理文本文件和二进制文件,Qt提供了QTextStream类和QDataStream类。
处理临时文件可以使用QTemporaryFile,获取文件信息可以使用QFileInfo,处理目录使用QDir。监视文件和目录变化可以
使用QFileSystemWatcher。
一、文件  /***************************************************************************************/
eg1:
QFile file("kai.txt");
if(file.open(QIODevice::ReadOnly)){
    char buffer[2048];
    qint64 lineLine = file.readLine(buffer,sizeof(buffer));
    if(lineLen != -1) //读取成功
        qDebug() << buffer;
}
eg2: QTextStream可以操作QIODevice、QByteArray和QString
QFile data("text.txt");
if(data.open(QFile::WriteOnly | QFile::Truncate)){
    QTextStream out(&data);
    out << QObject::tr("成绩:") << qSetFieldWidth(10) << left << 90 << endl;
}
eg3: 写/读二进制数据到数据流
//Qt中很多类型,包括QBrush,QColor,QFont,QDateTime,QString,QVariant,QPixmap都可写入数据流。
QFile file("binary.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QObject::tr("坐标:");
out << (qint32)42 << (qint32)96;
QFile file("binary.dat"); //读刚写入的数据
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 x, y;
in >> str >> x >> y;
使用setVersion()来设定文件格式的版本:
QDataStream out(file);
out.setVersion(QDataStream::Qt_4_3); //version()获得版本号
eg4 : 使用QData进行文件读写
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("binary.file");
    file.open(QIODevice::WriteOnly | QIODevice::Truncate);
    QDataStream out(&file);
    out << QString("zhangyue");
    out << QDate::fromString("1993/06/11","yyyy/MM/dd");
    out << (qint32)21;
    file.close();
    file.setFileName("binary.file"); //重新设置文件名
    if(!file.open(QIODevice::ReadOnly)){
        cout << "打开文件错误!";
        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();
    return a.exec();
}
QDataStream 可以读取任意的以QIODevice为基类的类生成的对象产生的数据,如QTcpSocket,
QUdpSocket,QBuffer,QFile,QProcess等类的数据。可以使用QDataStream在QAbstractSocket一端
写数据,另外一端使用QDataStream读数据,这样就免去了繁琐的高低字节转换操作。
临时文件:
Qt中提供了QTemporaryFile类来操作临时文件。QTemporaryFile类可以安全地创建一个独一无二的临时文件。临时文件可以使用open()来创


建,在临时文件对象销毁后,将自动删除该临时文件。临时文件通过close()关闭后可以再打开,只要临时文件没有被
销毁,临时文件就一直存在并有QTemporaryFile内部保持打开。系统的临时目录通过QDir::tempPath()来获取。
二、目录操作和文件管理  /*********************************************************************************/
isRelative(),isAbsolute()判断QDir对象使用的是相对路径还是绝对路径;makeAbsolute()将一个相对路径转换为绝对路径。
目录的路径使用path()返回,通过setPath()设置新路径,绝对路径使用absolutePath()返回。
dirName(),cd(),cdUp(),mkdir(),rename(),exists(),isReadable(),isRoot(),count(),remove(),rmdir().
entryList()返回目录下所有条目组成的字符串链表。entryInfoList()同理
eg: 
qint64 du(const QString &path){      //统计目录及子目录中所有文件的大小
    QDir dir(path);
    qint64 size = 0;
    foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))
        size += fileInfo.size();
    foreach(QString subDir,
            dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
        size += du(path + QDir::separator() + subDir);
    char unit = 'B';
    quint64 curSize = size;
    if(curSize > 1024){
        curSize /= 1024;
        unit = 'K';
        if(curSize > 1024){
            curSize /= 1024;
            unit = 'M';
            if(curSize > 1024){
                curSize /= 1024;
                unit = 'G';
            }
        }
    }
    cout << curSize << unit << "\t" << qFrintable(path) << endl;
    return size;
}
//QDirIterator类也可以完成枚举目录的功能。
文件搜索前缀:
QDir::setSearchPaths("docs",QStringList("C:\My Document"));
QDir::addSearchPath("docs",QStringList("D:\Document"));
QFile file("docs:qt5.doc");
文件管理:
QFile可以使用相对路径或绝对路径。文件名可在构造函数中传递,也可用setFile()函数指定。
exists(),size(),ifFile(),isDir(),isSymLink().symLinkTarget()返回符号链接所指向的真正文件名。
为了提高性能,QFileInfo将文件的一些信息进行了缓存。refresh()函数刷新文件信息。setCaching(false)关闭缓存从文件系统中读信息



path()返回目录,fileName()返回的文件名可以通过baseName()和extension()来获得主文件名和扩展文件名。
文件的存取权限:isReadable(),isWriteable(),isExecutable().文件属主:owner(),ownerId(),group(),groupId()
文件的权限和属主也可以通过permission()一起读取。
三、监视文件系统变化  /*********************************************************************************/
Qt中使用QFileSystemWatcher类来监视问价和目录的改变:
addPath()/addPaths(),removePath()/removePaths();
当监视的文件被修改或删除时,产生一个fileChanged()信号;如果被监视的目录被修改或删除,产生directoryChanged()信号。
eg:
Msg::Msg(){
    QFont font;
    font.setPointSize(24);
    setFont(font);
    QStringList args = qApp->arguments();
    QString path;
    if(args.count() > 1)
        path = args[1];
    else
        path = QDir::currentPath();
    label = new QLabel();
    label->setText(tr("监视的目录:") + path);
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    setLayout(layout);
    fsWatcher.addPath(path);
    connect(&fsWatcher,SIGNAL(directoryChanged(QString)),
            this,SLOT(directoryChanged(QString)));
}
四、文件引擎:略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值