• QT学习之文件系统读写类


    QT学习之文件系统读写类


    QIODevice

    • QFileDevice
    • QBuffer
    • QProcessQProcessEnvironment

    QFileDevice

    • QFile
    • QFileInfo

    QT5 Input/Output 类图


    QFile


    QFile 类用来对文件的操作:

    头文件 #include <QFile>
    模块 QT += core
    基类 QFileDevice.
    子类 QTemporaryFile

    使用QFile可以打开关闭文件,并对文件进行处理。其主要使用方法有:

    • 文件的读写
    QString text;
    QFile read(oldPath);
    if(!read.exists())return;
    if(read.open(QIODevice::ReadOnly)){
        text=read.readAll();
    }
    read.close();
    
    QFile write(newPath);
    if(write.open(QIODevice::WriteOnly)){
        write.write(text,qstrlen(text));
    }
    write.close();
    
    • 文件的读写--使用流
    QString text;
    QFile read(oldPath);
    if(!read.exists())return;
    if(read.open(QIODevice::ReadOnly)){
        QTextStream in(&read);  //使用流进行读写
        in.setCodec("UTF-8");   //设置读时编码
        text=in.readAll();      //使用流读取全部文件
    }
    read.close();
    
    QFile write(newPath);
    if(write.open(QIODevice::WriteOnly)){
        QTextStream out(&write);
        out.setCodec("UTF-8");
        out<<text;
    }
    write.close();
    
    • 复制文件
    QFile::copy(oldFilePath,newFilePath);
    //其中oldFilePath文件必须存在,newFilePath的路径中不能包含不存在的路径!
    
    • 删除文件
    bool QFile::remove()
    bool QFile::remove(const QString & fileName) [static]
    
    • 给文件重命名
    bool QFile::rename(const QString & newName)
    bool QFile::rename(const QString & oldName, const QString & newName) [static]
    
    • 为新文件创建路径
    QDir dir;
    dir.mkpath(dirpath);    
    //创建新目录,dirpath中的所有未创建的子文件夹都将被创建
    dir.setPath(dirCur);//设置当前路径
    dir.mkdir(dirName);
    //创建子目录,在当前目录下创建一个子文件夹dirName
    

    QFileInfo类处理文件的信息,构造函数:

    QFileInfo()
    QFileInfo(const QString & file)
    QFileInfo(const QFile & file)
    QFileInfo(const QDir & dir, const QString & file)
    QFileInfo(const QFileInfo & fileinfo)
    

    常用方法,假设文件为:"E:/dirPath/fileName.sfx"

    • 获取文件名,包含后缀
    QString    fileName() const  // 返回值为: "fileName.sfx"
    
    • 获取文件路径,到文件所在当前目录,不包含最后的 "/"
    QString    filePath() const  // 返回值为: "E:/dirPath"
    QDir    dir() const       
    
    • 获取文件后缀,不包括 "."
    QString    suffix() const    // 返回值为:  "sfx"
    
    • 判断文件是否存在,一般处理文件之前,都应先调用此方法
    bool    exists() const
    
    • 返回文件的绝对路径
    QString QFileInfo::absoluteFilePath() const  // 返回包括文件名的绝对路径。
    QString QFileInfo::absolutePath() const   // 返回不包括文件名的绝对路径。
    QDir QFileInfo::absoluteDir() const  
    
    • 返回文件的基名称
    QString QFileInfo::baseName() const
    eg:
        QFileInfo fi("/tmp/archive.tar.gz");
        QString base = fi.baseName();  // base = "archive"
    

    QDir 类处理有关文件目录路径问题,构造函数

    QDir(const QDir & dir)
    QDir(const QString & path = QString())
    QDir(const QString & path, const QString & nameFilter, SortFlags sort = SortFlags( Name | IgnoreCase ), Filters filters = AllEntries)
    
    • 获取目录内指定后缀的文件,获取的文件的路径(绝对路径)
    QFileInfoList QDir::entryInfoList(const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort) const
    eg:
        QStringList fileList;
        fileList<<"*.xml"<<"*.txt"; //只显示xml文档和txt文档
        QDir dir;
        dir.setPath(dirPath);
        if(!dir.exists())return;
        //设置目录下显示的内容,这里只显示文件,不显示文件夹
        dir.setFilter(QDir::Files); 
        //设置目录下文件的排序方式,这里为按名称排序
        dir.setSorting(QDir::Name);
        //设置过滤字段
        dir.setNameFilters(fileList);
        //获取目录下对应文件
        QFileInfoList list = dir.entryInfoList();
    

    QSaveFile


    QSaveFile类是为了安全的进行写操作而设计的,用来写入文本和二进制数据到文件中,当写入操作失败时,不会丢失要写入的数据。
      当要写入数据时,会先建立一个临时的文件保存要写入的数据。如果在写入过程中没有错误发生,则使用commit() 提交到最终要写入的文件中去。这种机制确保了一旦发生写入错误,写入的文件中不会没有数据。并且没有部分写入的文件总是出现在最后的位置。当向磁盘写入文档时经常使用此类。
    QSaveFile会在写入过程中自动的检查错误。可以像QFile类那样来进行操作文件,使用 open() 打开文件,也可以使用继承自QIODevice 类的方法操作。但不能使用close(),而是使用commit()!由于应用程序出错导致的呼叫 cancelWriting(),即使调用 commit() 也不会进行保存。
    其自身Public 方法:

    QSaveFile(const QString & name)
    QSaveFile(QObject * parent = 0)
    QSaveFile(const QString & name, QObject * parent)
    ~QSaveFile()
    void    cancelWriting()
    bool    commit()
    bool    directWriteFallback() const
    void    setDirectWriteFallback(bool enabled)
    void    setFileName(const QString & name)
    

    QTemporaryDir


    QTemporaryDir用于安全的建立一个临时的目录,目录名由类构造函数自动生成。使用 QString path() const 获取路径。
    其自身公用方法有:

    QTemporaryDir()
    QTemporaryDir(const QString & templatePath)
    ~QTemporaryDir()
    bool    autoRemove() const
    bool    isValid() const
    QString    path() const
    bool    remove()
    void    setAutoRemove(bool b)
    

    QT给出的列子:

     // Within a function/method...
    
        QTemporaryDir dir;
        if (dir.isValid()) {
            // dir.path() returns the unique directory path
        }
    
        // The QTemporaryDir destructor removes the temporary directory
        // as it goes out of scope.
    

    QTemporaryFile


    QTemporaryFile用于安全的创建一个临时文件。调用open()时自动创建。自身公共方法有:

    QTemporaryFile()
    QTemporaryFile(const QString & templateName)
    QTemporaryFile(QObject * parent)
    QTemporaryFile(const QString & templateName, QObject * parent)
    ~QTemporaryFile()
    bool    autoRemove() const
    QString    fileTemplate() const
    bool    open()
    void    setAutoRemove(bool b)
    void    setFileTemplate(const QString & name)
    

    QT给出的使用列子:

    // Within a function/method...
    
        QTemporaryFile file;
        if (file.open()) {
            // file.fileName() returns the unique file name
        }
    
        // The QTemporaryFile destructor removes the temporary file
        // as it goes out of scope.
    

    QDirIterator


    QDirIterator用于遍历目录,无基类!

    Constant Value Description
    QDirIterator::NoIteratorFlags 0x0 默认情况,迭代器将返回指定目录的条目
    QDirIterator::Subdirectories 0x2 列出指定目录的所有子条目(包括子目录下的目录)
    QDirIterator::FollowSymlinks 0x1 Subdirectories条件下忽略符号链接 "." 或者 ".."

    其自身公有方法:

    QDirIterator(const QDir & dir, IteratorFlags flags = NoIteratorFlags)
    QDirIterator(const QString & path, IteratorFlags flags = NoIteratorFlags)
    QDirIterator(const QString & path, QDir::Filters filters, IteratorFlags flags = NoIteratorFlags)
    QDirIterator(const QString & path, const QStringList & nameFilters, QDir::Filters filters = QDir::NoFilter, IteratorFlags flags = NoIteratorFlags)
    ~QDirIterator()
    QFileInfo    fileInfo() const
    QString    fileName() const
    QString    filePath() const
    bool    hasNext() const
    QString    next()
    QString    path() const
    

    QT给出的例子:

    QDirIterator it("/etc", QDirIterator::Subdirectories);
    while (it.hasNext()) {
        qDebug() << it.next();
    
        // /etc/.
        // /etc/..
        // /etc/X11
        // /etc/X11/fs
        // ...
    }
    

    QStandardPaths


    QStandardPaths用于处理系统标准路径。

    QString    displayName(StandardLocation type)
    QString    findExecutable(const QString & executableName, const QStringList & paths = QStringList())
    QString    locate(StandardLocation type, const QString & fileName, LocateOptions options = LocateFile)
    QStringList    locateAll(StandardLocation type, const QString & fileName, LocateOptions options = LocateFile)
    void    setTestModeEnabled(bool testMode)
    QStringList    standardLocations(StandardLocation type)
    QString    writableLocation(StandardLocation type)
    
    enum    LocateOption { LocateFile, LocateDirectory }
    flags    LocateOptions
    enum    StandardLocation { DesktopLocation, DocumentsLocation, FontsLocation, ApplicationsLocation, ..., GenericConfigLocation }
    

    QT Dialogs类图


    这里只简单说一下QFileDialog类:

    头文件 #include <QFileDialog>
    模块 QT += widgets
    基类 QDialog

    常用静态成员函数:

    • 打开一个获取目录的对话框
    QString    getExistingDirectory( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), Options options = ShowDirsOnly)
    QUrl       getExistingDirectoryUrl( QWidget * parent = 0, const QString & caption = QString(), const QUrl & dir = QUrl(), Options options = ShowDirsOnly, const QStringList & supportedSchemes = QStringList())
    
    • 打开一个选择文件的对话框
    QString        getOpenFileName( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)
    QStringList    getOpenFileNames(QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)
    QUrl       getOpenFileUrl( QWidget * parent = 0, const QString & caption = QString(), const QUrl & dir = QUrl(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0, const QStringList & supportedSchemes = QStringList())
    QList<QUrl>    getOpenFileUrls( QWidget * parent = 0, const QString & caption = QString(), const QUrl & dir = QUrl(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0, const QStringList & supportedSchemes = QStringList())
    
    • 打开另存为对话框,返回另存为文件的全路径地址
    QString    getSaveFileName( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0)
    QUrl       getSaveFileUrl( QWidget * parent = 0, const QString & caption = QString(), const QUrl & dir = QUrl(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0, const QStringList & supportedSchemes = QStringList())
    

    其中 QString & filter = QString() 代表文件过滤器,写法如下:

    QStringList ls=
        QFileDialog::getOpenFileNames(this
                            ,tr("选用文件")
                            ,QStandardPaths::standardLocations(QStandardPaths::DesktopLocation).at(0)
                            ,tr("XML文件 (*.xml);;文本文件(*.txt"));
    
  • 相关阅读:
    字符编码 乱码问题
    Django ORM那些相关操作
    pymysql模块使用---Python连接MySQL数据库
    数据库MySQL 之 索引原理与慢查询优化
    数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件
    数据库 MySQL 之 数据操作
    数据库 MySQL 之 表操作、存储引擎
    [BZOJ 4212]神牛的养成计划(Trie+可持久化Trie)
    [LuoguP4094] [HEOI2016] [TJOI2016]字符串(二分答案+后缀数组+ST表+主席树)
    [BZOJ 2865]字符串识别(后缀数组+线段树)
  • 原文地址:https://www.cnblogs.com/lomper/p/4274720.html
走看看 - 开发者的网上家园