Qt文件和文件夹操作

4 篇文章 0 订阅
2 篇文章 0 订阅
  • 拷贝文件夹中的文件

  • 拷贝文件

  • 移除文件夹

  • win拷贝文件到文件夹

  1. 拷贝文件夹中的文件

#ifndef Q_OS_LINUX
#include <Windows.h>
HWND _relatedWindow()
{
    HWND hActive = ::GetActiveWindow();
    return hActive;
}
inline const WCHAR* utf16(const QString& str)
{
    return reinterpret_cast<const WCHAR*>(str.c_str16());
}
bool copyDirectoryFiles(const QString& srcPath, const QString& desPath, bool bRemoveFlag, bool bSlientFlag)
{
    WCHAR szDesPath[MAX_PATH + 2] = {0};
    memcpy_s(szDesPath, sizeof(szDesPath), krt::utf16(desPath),
        qMin<int>(MAX_PATH, desPath.length()) * sizeof(WCHAR));

    WCHAR szSrcPath[MAX_PATH + 2] = {0};
    memcpy_s(szSrcPath, sizeof(szSrcPath), krt::utf16(srcPath),
        qMin<int>(MAX_PATH, srcPath.length()) * sizeof(WCHAR));

    QString strProgressTitle = QObject::tr("Copying Files, Please wait...");

    SHFILEOPSTRUCTW tFileOperation = {0};
    tFileOperation.hwnd = _relatedWindow();
    tFileOperation.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR;
    if (bSlientFlag)
    {
        tFileOperation.fFlags |= (FOF_SILENT | FOF_NOCONFIRMATION);
    }
    tFileOperation.pFrom = szSrcPath;
    tFileOperation.pTo = szDesPath;
    tFileOperation.hNameMappings = NULL;
    tFileOperation.lpszProgressTitle = krt::utf16(strProgressTitle);
    tFileOperation.wFunc = bRemoveFlag ? FO_MOVE : FO_COPY;

    int nResultCode = ::SHFileOperationW(&tFileOperation);

    return 0 == nResultCode;
}
#else
#include "QDir"
//bCoverFile:是否覆盖目标目录文件,bRemoveFlag:是否移除源目录文件
bool KpcdFileUtil::copyDirectoryFiles(const QString& srcPath, const QString& desPath,
                                    bool bCoverFile/* = false*/, bool bRemoveFlag/* = false*/)
{
    QDir sourceDir(srcPath);
    if(!sourceDir.exists())
        return false;

    if(QFileInfo(desPath).isFile())
        return false;
    QDir targetDir(desPath);
    if(!targetDir.exists())
    {
        if(!targetDir.mkpath(desPath))
            return false;
    }

    QFileInfoList fileInfoList = sourceDir.entryInfoList(
                QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
    for(const QFileInfo& fileInfo : fileInfoList)
    {
        if(fileInfo.isDir())
        {
            if(!copyDirectoryFiles(fileInfo.filePath(),
                                    targetDir.absoluteFilePath(fileInfo.baseName()),
                                    bCoverFile, bRemoveFlag))
            {
                return false;
            }
        }
        else
        {
            if (bCoverFile)
                QFile::remove(targetDir.filePath(fileInfo.fileName()));
            if(QFile::copy(fileInfo.filePath(),
                        targetDir.filePath(fileInfo.fileName())))
            {
                if(bRemoveFlag && fileInfo.isWritable())
                {
                    QFile::remove(fileInfo.absoluteFilePath());
                }
            }
            else
            {
                return false;
            }
        }
    }
    if(bRemoveFlag)
    {
        sourceDir.rmdir(sourceDir.absolutePath());
    }
    return true;
}
#endif
  1. 拷贝文件

#include "QFile"
//srcPath源文件路径,dstPath目标文件路径,bCoverFile文件存在的话是否覆盖
bool copyFile(QString srcPath, QString dstPath, bool bCoverFile/* = false*/)
{
#ifdef Q_OS_WIN
    srcPath.replace("/", "\\");
    dstPath.replace("/", "\\");
#elif defined(Q_OS_LINUX)
    srcPath.replace("\\", "/");
    dstPath.replace("\\", "/");
#endif
    if (srcPath == dstPath)
        return true;

    //源文件不存在
    if (!QFile::exists(srcPath))
        return false;

    if (QFile::exists(dstPath))
    {
        if (bCoverFile)
        {
            QFile::remove(dstPath);
        }
    }

    if (!QFile::copy(srcPath, dstPath))
    {
        return false;
    }
    return true;
}
  1. 移除文件夹

#include "QDir"
bool RemoveDir(const QString& path)
{
    if (path.isEmpty())
        return false;

    QDir dir(path);
    if(!dir.exists())
        return true;

    dir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
    QFileInfoList fileList = dir.entryInfoList();
    for (const QFileInfo& fi : fileList)
    {
        if (fi.isFile())
            fi.dir().remove(fi.fileName());
        else
            RemoveDir(fi.absoluteFilePath());
    }
    return dir.rmpath(dir.absolutePath());
}
  1. win拷贝文件到文件夹

#include <Windows.h>
inline const WCHAR* utf16(const QString& str)
{
    return reinterpret_cast<const WCHAR*>(str.c_str16());
}
HWND _relatedWindow()
{
    HWND hActive = ::GetActiveWindow();
    return hActive;
}
bool KpcdFileUtil::copyFilesToFolder(const QStringList& srcPathList,
    const QString& destFolder, bool bRemoveFlag, bool bSlientFlag/* = false*/)
{
    if (srcPathList.isEmpty() || destFolder.isEmpty())
        return false;

    WCHAR szDestPath[MAX_PATH + 2] = { 0 };
    ks_memcpy_s(szDestPath, sizeof(szDestPath), krt::utf16(destFolder),
        qMin<int>(MAX_PATH, destFolder.length()) * sizeof(WCHAR));

    int srcPathLen = 1; //eg:"D:\\src1.txt\0D:\\src2.txt\0\0"
    for (const auto& srcPath : srcPathList)
    {
        srcPathLen += (srcPath.size() + 1);
    }
    WCHAR* szSrcPath = new WCHAR[srcPathLen]();
    WCHAR* szSrcData = szSrcPath;
    for (const auto& srcPath : srcPathList)
    {
        srcPath.toWCharArray(szSrcData);
        szSrcData += (srcPath.size() + 1);
    }

    QString strProgressTitle = QObject::tr("Copying Files, Please wait...");
    SHFILEOPSTRUCTW tFileOperation = { 0 };
    tFileOperation.hwnd = _relatedWindow();
    tFileOperation.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR;
    if (bSlientFlag)
    {
        tFileOperation.fFlags |= (FOF_SILENT | FOF_NOCONFIRMATION);
    }
    tFileOperation.pFrom = szSrcPath;
    tFileOperation.pTo = szDestPath;
    tFileOperation.hNameMappings = NULL;
    tFileOperation.lpszProgressTitle = krt::utf16(strProgressTitle);
    tFileOperation.wFunc = bRemoveFlag ? FO_MOVE : FO_COPY;

    int nResultCode = ::SHFileOperationW(&tFileOperation);
    delete[] szSrcPath;
    return 0 == nResultCode;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值