Qt刪除目錄及目錄下全部文件

==========2017年10月12日更新==========windows

最近在作安裝包,看到qt-installer-framework源碼裏有相關源代碼,之後刪除文件夾就能夠直接照搬這個了app

void removeFiles(const QString &path, bool ignoreErrors)
{
    const QFileInfoList entries = QDir(path).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;
            }
        }
    }
}
static QString errnoToQString(int error)
{
#if defined(Q_OS_WIN) && !defined(Q_CC_MINGW)
    char msg[128];
    if (strerror_s(msg, sizeof msg, error) != 0)
        return QString::fromLocal8Bit(msg);
    return QString();
#else
    return QString::fromLocal8Bit(strerror(error));
#endif
}

void removeDirectory(const QString &path, bool ignoreErrors)
{
    if (path.isEmpty()) // QDir("") points to the working directory! We never want to remove that one.
        return;

    QStringList dirs;
    QDirIterator it(path, QDir::NoDotAndDotDot | QDir::Dirs | QDir::NoSymLinks | QDir::Hidden,
        QDirIterator::Subdirectories);
    while (it.hasNext()) {
        dirs.prepend(it.next());
        removeFiles(dirs.at(0), ignoreErrors);
    }

    QDir d;
    dirs.append(path);
    removeFiles(path, ignoreErrors);
    foreach (const QString &dir, dirs) {
        errno = 0;
        if (d.exists(path) && !d.rmdir(dir)) {
            const QString errorMessage = QCoreApplication::translate("QInstaller",
                "Cannot remove directory \"%1\": %2").arg(QDir::toNativeSeparators(dir),
                                                          errnoToQString(errno));
            if (!ignoreErrors)
                qWarning()<< errorMessage;
        }
    }
}

 

=====================================================code

查過資料好像Qt和windows都沒有這樣一個接口能直接刪除一個不爲空的目錄。遞歸

本身實現了一個,採用遞歸,估計目錄太深堆棧就爆掉了吧接口

void deleteDir(const QString &d)
{
    QDir dir(d);
    foreach (QFileInfo inf, dir.entryInfoList(QDir::Dirs|QDir::Files)) {
        if(inf.isFile())
            dir.remove(inf.absoluteFilePath());
        else if(inf.isDir() &&
                inf.fileName() != "." &&
                inf.fileName() != "..")
            deleteDir(inf.absolutePath()+"/"+inf.fileName());
    }
    dir.rmdir(dir.absolutePath());
}
相關文章
相關標籤/搜索