25

我需要使用 Qt 删除目录中的所有文件。

目录中的所有文件都将具有扩展名“.txt”。

我不想删除目录本身。

有谁知道我该怎么做?我看过 QDir 但没有运气。

4

8 回答 8

56

Bjorns 回答 tweeked 不会永远循环

QString path = "whatever";
QDir dir(path);
dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);
foreach(QString dirFile, dir.entryList())
{
    dir.remove(dirFile);
}
于 2013-08-23T18:35:26.263 回答
13

忽略 txt 扩展名过滤...这是一种删除文件夹中所有内容的方法,包括非空子目录:

在 QT5 中,您可以在目录上使用 removeRecursively()。不幸的是,这会删除整个目录 - 而不仅仅是清空它。这是清除目录内容的基本功能。

void clearDir( const QString path )
{
    QDir dir( path );

    dir.setFilter( QDir::NoDotAndDotDot | QDir::Files );
    foreach( QString dirItem, dir.entryList() )
        dir.remove( dirItem );

    dir.setFilter( QDir::NoDotAndDotDot | QDir::Dirs );
    foreach( QString dirItem, dir.entryList() )
    {
        QDir subDir( dir.absoluteFilePath( dirItem ) );
        subDir.removeRecursively();
    }
}

或者,您可以在要清除的目录上使用 removeRecursively() (这将完全删除它)。然后,在此之后用相同的名称重新创建它......效果将是相同的,但代码行数更少。然而,如果需要,这个更详细的功能为添加详细的异常处理提供了更多的可能性,例如检测特定文件/文件夹的访问冲突......

于 2014-01-13T20:44:12.623 回答
5

调用 QDir::entryList(QDir::Files) 来获取目录中所有文件的列表,然后对于每个以“.txt”结尾的文件名调用 QDir::remove(fileName) 来删除文件。

于 2013-02-07T16:35:11.577 回答
1

您以一种很好的方式开始,查看entryList并且当然传递了您想要的名称过滤器。

于 2013-02-07T15:44:03.327 回答
1

为了改进@user3191791 的答案(删除所有文件和目录),这个答案:

  • 使用基于范围的 for 循环对代码进行现代化改造
  • 提供可选的错误检查

编码:

struct FileOperationResult
{
    bool success;
    QString errorMessage;
};

FileOperationResult removeDirContents(const QString &dirPath)
{
    QDir dir(dirPath);

    dir.setFilter(QDir::NoDotAndDotDot | QDir::Files);
    const QStringList files = dir.entryList();
    for (const QString &fileName : files) {
        if (!dir.remove(fileName)) {
            const QString failureMessage = QString::fromUtf8(
                "Failed to remove file %1 from %2").arg(fileName, dirPath);
            return { false, failureMessage };
        }
    }

    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs);
    const QStringList dirs = dir.entryList();
    for (const QString &dirName : dirs) {
        QDir subDir(dir.absoluteFilePath(dirName));
        if (!subDir.removeRecursively()) {
            const QString failureMessage = QString::fromUtf8(
                "Failed to recursively remove directory %1 from %2").arg(dirName, dirPath);
            return { false, failureMessage };
        }
    }

    return { true, QString() };
}

用法:

const FileOperationResult removeResult = removeDirContents(path);
if (!removeResult.success)
    qWarning() << removeResult.errorMessage;
于 2021-04-17T10:24:06.277 回答
0

我会这样做:

QString path = "name-of-directory";
QDir dir(path);
dir.setNameFilters(QStringList() << "*.txt");
dir.setFilters(QDir::Files);
while(dir.entryList().size() > 0){
    dir.remove(dir.entryList().first());
}
于 2013-02-13T13:33:30.963 回答
0

rreeves 代码的其他变体:

QDir dir("/path/to/file");

dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);

for(const QString &dirFile: dir.entryList()) {
  dir.remove(dirFile);
}
于 2018-04-24T11:43:02.653 回答
-3

您可以在不使用 Qt 的情况下实现这一点:为此,opendir、readdir、unlink 甚至 rmdir 都将成为您的朋友。它易于使用,只需浏览手册页;)。

于 2013-02-07T15:42:56.647 回答