Qt文件操作

发布于:2025-02-10 ⋅ 阅读:(140) ⋅ 点赞:(0)

目录

一、文件操作相关类

1.QFile

2.QFileInfo

3.QTextStream

4.QDataStream

5.QDir

6.QFileSystemWatcher

7.QTemporaryFile

二、文件操作示例

1.文本文件操作

2.目录操作

3.二进制文件操作


一、文件操作相关类

1.QFile

QFile类用于文件的创建、读写、复制、删除等操作,可以实现文本文件和二进制文件的读写。

常用函数:

  1. open():打开文件,参数决定文件的打开方式,如只读、只写、读写、追加等。
  2. close():关闭文件。
  3. readLine():读取一行。
  4. readAll():读取所有内容。
  5. write():向文件中写入数据。
  6. atEnd():判断是否到达文件尾。
  7. seek():将文件指针定位到指定位置处。
  8. pos():获取文件指针当前位置。

      

2.QFileInfo

QFileInfo类用于提供文件信息,包括文件的名称、在文件系统中的路径、文件的访问权限等,还可以获取文件的大小和最近一次修改的时间。

常用函数:

  1. exists():判断文件是否存在。
  2. isSymLink():判断文件是否是符号链接。
  3. symLinkTarget():如果文件是符号链接,返回原始文件的完整路径文件名,否则返回空字符串。
  4. size():获取文件大小。
  5. lastModified():获取文件最后修改时间。
  6. lastRead():获取文件最后读取时间。
  7. permissions():获取文件权限。

     

3.QTextStream

QTextStream类用于对数据进行文本格式的读/写操作,可以操作QIODevice、QByteArray和QString。

  • 写入操作:使用流插入运算符<<可以方便地将各种数据类型写入到文本流中,如整数、浮点数、字符串等。
  • 读取操作:使用流提取运算符>>可以从文本流中读取各种数据类型。还提供了readLine()、readAll()等函数用于按行或一次性读取所有文本内容。
  • 格式设置:可以通过setFieldWidth()、setPadChar()等函数设置字段宽度和填充字符;通过setFieldAlignment()设置字段对齐方式;通过setRealNumberNotation()和setRealNumberPrecision()设置实数的表示形式和精度等。

常用函数:

  1. operator>>():从流中读取数据。
  2. operator<<():向流中写入数据。
  3. readLine():读取一行文本。
  4. readAll():读取全部文本。

     

    4.QDataStream

    QDataStream类用于对数据进行二进制格式的读写操作,只能操作QIODevice或QByteArray。

    • 写入操作:使用流插入运算符<<将各种数据类型以二进制形式写入到数据流中,支持的Qt类型包括QBrush、QColor、QDateTime、QFont、QPixmap、QString、QVariant等,还包括QList、QVector、QSet、QMap等容器类型。
    • 读取操作:使用流提取运算符>>从数据流中读取数据,读取数据类型的顺序应与写入时的一致。
    • 版本控制:可以通过setVersion()函数设置版本号,以确保在读取和写入复杂类型时使用相同的版本,保证数据的兼容性。
    • 字节序设置:可以通过setByteOrder()函数设置字节序,默认是大端字节序。
    • 原始数据读写:提供了readRawData()和writeRawData()函数用于直接读写原始的未编码二进制数据,还提供了readBytes()和writeBytes()函数,先读取或写入一个quint32值表示数据长度,然后再读取或写入相应字节的数据。

    常用函数:

    1. operator>>():从流中读取二进制数据。
    2. operator<<():向流中写入二进制数据。
    3. readRawData():将数据从流中读取到预先分配的缓冲区中。
    4. writeRawData():将数据写入到流中。

        

    5.QDir

    QDir类用于操纵路径名和底层的文件系统,如创建文件夹、遍历文件夹等。

    常用函数:

    1. exists():判断目录是否存在。
    2. mkdir():创建一个新的目录。
    3. rmdir():删除一个空目录。
    4. entryList():返回目录中的文件和目录列表。
    5. cd():切换当前目录。
    6. cdUp():切换到上级目录。
    7. absolutePath():获取目录的绝对路径。
    8. canonicalPath():获取目录的规范路径。

        

    6.QFileSystemWatcher

    QFileSystemWatcher类通过观察指定路径的列表来监视文件系统中文件和目录的更改,当文件已被修改、重命名或从磁盘中删除就会发送相应信号。

    常用函数:

    1. addPath():添加一个监视路径。
    2. removePath():移除一个监视路径。
    3. directories():返回正在监视的目录列表。
    4. files():返回正在监视的文件列表。
    5. directoryChanged:当监视的目录发生变化时发射此信号。
    6. fileChanged:当监视的文件发生变化时发射此信号。

         

    7.QTemporaryFile

    QTemporaryFile类用于创建临时文件,临时文件在应用程序运行时用于暂时存储数据,在不需要时通常会自动删除。

    常用函数:

    1. open():打开临时文件以进行读取和写入操作。
    2. write():将数据写入临时文件。
    3. readAll():一次性读取整个临时文件的内容。
    4. fileName():获取临时文件的路径。
    5. size():获取临时文件的大小。
    6. autoRemove():设置临时文件在销毁时是否自动删除。

          


         

    二、文件操作示例

    1.文本文件操作

        //获取应用程序当前目录的绝对路径
        QString cur_path = QCoreApplication::applicationDirPath();
        //选择文件
        QString cur_name = QFileDialog::getOpenFileName(
                                this, "Open File",cur_path,
                                "txt(*.txt);;all(*.*);;images(*.png *.jpg)");
        if(cur_name.isEmpty()) return;
    
        //打开文件
        QFile cur_file(cur_name);
        if(!cur_file.open(QIODevice::ReadOnly|QIODevice::Text)) return;
    
        //读文件
        QTextStream cur_stream(&cur_file);
        //全部读取
        QString str = cur_stream.readAll();
        qDebug()<<str;
        //按行读取
        while(!cur_stream.atEnd()){
            QString str = cur_stream.readLine();
            qDebug()<<str;
        }
    
        //创建一个新文件
        QFile new_file("D:/test01.txt");
        if(!new_file.open(QIODevice::WriteOnly)) return;
        QTextStream new_stream(&new_file);
        //写文件
        new_stream<<"Hello World!";
        new_file.close();
        //删除文件
        if(new_file.exists())
            new_file.remove();
    
        //复制文件两种方式
        if(!QFile::copy(cur_name,new_file.fileName())) return;
        //if(!cur_file.copy(new_file.fileName())) return;
        
        //文件信息
        QFileInfo info(cur_name);
        if(!info.exists()) return;
        qDebug() << "文件名称:" << info.fileName();
        qDebug() << "文件路径:" << info.filePath();
        qDebug() << "文件大小:" << info.size() << "bytes";
        qDebug() << "文件最后读取时间:"
                 << info.lastRead().toString("yyyy-MM-dd hh:mm:ss");
        qDebug() << "文件最后修改时间:"
                 << info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
    
        //关闭文件
        cur_file.close();

           

    2.目录操作

        //遍历目录
        QDir dir_traverse("D:/");
        QStringList dir_list = dir_traverse.entryList(
            QDir::NoDotAndDotDot|QDir::AllEntries);
        qDebug()<<"D:";
        for(int i=0;i<dir_list.size();i++)
            qDebug()<<dir_list[i];
        
        //创建目录
        QDir new_dir;
        QString new_path = "D:/new_directory";
        if(!new_dir.exists(new_path))
            if(!new_dir.mkdir(new_path))
                qDebug()<<"create error";
        
        //重命名目录
        QDir rename_dir;
        QString old_name =  "D:/new_directory";
        QString new_name =  "D:/renamed_directory";
        if(rename_dir.exists(old_name))
            if(!rename_dir.rename(old_name,new_name))
                qDebug()<<"rename error";
        
        //删除目录
        QDir delete_dir;
        QString delete_path = "D:/renamed_directory";
        if(delete_dir.exists(delete_path))
            if(!delete_dir.rmdir(delete_path))
                qDebug()<<"delete error";
        
        //获取当前目录
        QString current_path = QDir::currentPath();
        qDebug()<<"current directory: "<<current_path;
        
        //切换目录
        QDir change_dir;
        QString change_path = "D:/";
        if(change_dir.cd(change_path))
            qDebug()<<"current directory: "<<change_path;

           

    3.二进制文件操作

    写入二进制文件:

    class Person{
    public:
        QString name;
        qint16 age;
    };
    
    //重载<<运算符
    QDataStream& operator<<(QDataStream &out, const Person &person){
        out<<person.name<<person.age;
        return out;
    }
    
    
    QFile file("D:/test02.txt");
    if(!file.open(QIODevice::WriteOnly)) return;
    
    QDataStream out(&file);
    out.setVersion(QDataStream::Qt_6_0);
    
    int x1 = 12;
    double x2 = 5.55;
    QString x3 = "hello";
    
    Person p1 = {"Alice",25};
    Person p2 = {"Bob",23};
    
    out<<x1<<x2<<x3<<p1<<p2;
    
    file.close();

    读取二进制文件:

    class Person{
    public:
        QString name;
        qint16 age;
    };
    
    //重载>>运算符
    QDataStream& operator>>(QDataStream &in, Person &person){
        in>>person.name>>person.age;
        return in;
    }
    
    QFile file("D:/test02.txt");
    if(!file.open(QIODevice::ReadOnly)) return;
    
    QDataStream in(&file);
    in.setVersion(QDataStream::Qt_6_0);
    
    int x1;
    double x2;
    QString x3;
    
    Person p1;
    Person p2;
    
    in>>x1>>x2>>x3>>p1>>p2;
    
    qDebug()<<x1<<x2<<x3;
    qDebug()<<p1.name<<p1.age;
    qDebug()<<p2.name<<p2.age;
    
    file.close();

         


    网站公告

    今日签到

    点亮在社区的每一天
    去签到