Qt 之 文件与文件夹

QFile与QFileInfo

  1. QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口;
  2. QFlie:访问本地文件或者嵌入资源;
  3. QTemporaryFile:创建和访问本地文件系统的临时文件;
  4. QFileDevice:Qt5类,提供了有关文件操作的通用实现。

这其中,QProcess、QTcpSocket、QUdpSoctet和QSslSocket是顺序访问设备。所谓“顺序访问”,是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节;QFile、QTemporaryFile和QBuffer是随机访问设备,可以访问任意位置任意次数,还可以使用QIODevice::seek()函数来重新定位文件访问位置指针。

QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Open file failed.";
        return -1;
    } else {
        while (!file.atEnd()) {
            qDebug() << file.readLine();
        }
    }
 
    QFileInfo info(file);
    qDebug() << info.isDir();
    qDebug() << info.isExecutable();
    qDebug() << info.baseName();
    qDebug() << info.completeBaseName();
    qDebug() << info.suffix();
    qDebug() << info.completeSuffix();
QFileInfo fi("/tmp/archive.tar.gz");
QString base  = fi.baseName();  // base = "archive"
QString cbase = fi.completeBaseName();  // cbase = "archive.tar"
QString ext   = fi.suffix();  // ext = "gz"
QString ext   = fi.completeSuffix();  // ext = "tar.gz"

QDataStream

QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)

QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << QString("the answer is");
out << (qint32)42;
file.close();
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
QString str;
qint32 a;
in >> str >> a;

//保证Qt的版本一致,指定版本和魔术字

// 写入魔术数字和版本
out << (quint32)0xA0B0C0D0;
out << (qint32)123;
 
out.setVersion(QDataStream::Qt_4_0);

常用功能:

#程序路径

qDebug() << QGuiApplication::applicationDirPath();
qDebug() << QGuiApplication::applicationFilePath();
qDebug() << QDir::currentPath();

//输出
"C:/wmm/zyb/Z03/build-Z03-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug/debug"
"C:/wmm/zyb/Z03/build-Z03-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug/debug/Z03.exe"
"C:/wmm/zyb/Z03/build-Z03-Desktop_Qt_5_14_2_MSVC2017_64bit-Debug"

#文件夹内文件排序

QStringList LocalCacheData::initCacheData(const QString &path)
{
    m_dataList.clear();
    if(!path.isEmpty())
        m_curDirPath = path;
    QDir dir(m_curDirPath);
    if(!dir.exists())
    {
        return QStringList();
    }

    dir.setFilter(QDir::Files | QDir::NoSymLinks);
    QFileInfoList list =dir.entryInfoList();
    for(int i=0; i < list.count(); i++)
    {
        QFileInfo file_info = list.at(i);
        QString suffix = file_info.suffix();
        if(QString::compare(suffix, QString("jpg"),Qt::CaseInsensitive) == 0)
        {
            QString absolute_file_path=  file_info.absoluteFilePath();
            m_dataList.append( absolute_file_path);
        }
    }

    QCollator collator;
    collator.setNumericMode(true);

    std::sort(m_dataList.begin(), m_dataList.end(),
              [& collator](const QString & str1, const QString & str2)
    {
        return collator.compare(str1, str2) > 0;
    }
    );

    return m_dataList;
}

#删除文件

void removeLocalFile(const QString &path)
{
    QFile tmp(path);
    tmp.remove();
}

#判断文件是否存在

bool existImg(const QString &path)
{
    QFileInfo file(path);
    return  file.exists();
}

#创建文件夹

void creatDir(const QString &path)
{
    QDir dir;
    if(!dir.exists(path)){
        bool b = dir.mkdir(path);
        qDebug() << "creat Dir "<<path << "res= " << b;
    }
}

#创建多级文件夹

QString LocalCacheData::creatMutiDir(const QString &path)
{
    QDir dir(path);
    if ( dir.exists(path)){
        return path;
    }
    QString parentDir = creatMutiDir(path.mid(0,path.lastIndexOf('/')));
    QString dirname = path.mid(path.lastIndexOf('/') + 1);
    QDir parentPath(parentDir);
    if ( !dirname.isEmpty() )
        parentPath.mkpath(dirname);
    return parentDir + "/" + dirname;
}

#创建文本文件

void creatFile(const QString &path)
{
    QFile file(path);
    if(!file.exists())
    {
        if(file.open(QIODevice::WriteOnly |QIODevice::Text )){
        }
        else {
            qDebug() << "creatFile failed" << path;
        }
        file.close();
    }
}

#删除文件夹内所有文件

void clearDir(const QString &dir)
{
    const QFileInfoList entries = QDir(dir).entryInfoList(QDir::AllEntries | QDir::Hidden);
    foreach (const QFileInfo &fi, entries) {
        if (fi.isSymLink() || fi.isFile()) {
            QFile f(fi.filePath());
            if (!f.remove()) {
                const QString errorMessage = QCoreApplication::translate("QInstaller",
                                                                         "Cannot remove file \"%1\": %2").arg(
                            QDir::toNativeSeparators(f.fileName()), f.errorString());
                qWarning()<< errorMessage;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值