C++ 删除目录中的所有文件

C++ 删除目录中的所有文件,c++,qt,C++,Qt,我需要使用Qt删除目录中的所有文件 目录中的所有文件的扩展名都是“.txt” 我不想删除目录本身 有人知道我怎么做吗?我看过QDir,但运气不好。不用Qt就可以做到这一点:要做到这一点,opendir、readdir、unlink,甚至rmdir都将是你的朋友。它很容易使用,只需浏览手册页;) 您的启动方式很好,查看并传递所需的名称筛选器。调用QDir::entryList(QDir::Files)获取目录中所有文件的列表,然后对于以“.txt”结尾的每个文件名,调用QDir::remove(f

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

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

我不想删除目录本身


有人知道我怎么做吗?我看过QDir,但运气不好。

不用Qt就可以做到这一点:要做到这一点,opendir、readdir、unlink,甚至rmdir都将是你的朋友。它很容易使用,只需浏览手册页;)

您的启动方式很好,查看并传递所需的名称筛选器。

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

我将这样做:

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());
}
QString path=“目录名”;
QDir dir(路径);
目录setNameFilters(QStringList()0){
dir.remove(dir.entryList().first());
}

b约恩的答案是永远不要循环

QString path = "whatever";
QDir dir(path);
dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);
foreach(QString dirFile, dir.entryList())
{
    dir.remove(dirFile);
}
QString path=“无论什么”;
QDir dir(路径);

dir.setNameFilters(QStringList()忽略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()(这将完全删除它)。然后,用相同的名称重新创建它…效果相同,但代码行数较少。但是,如果需要,此更详细的功能提供了更多添加详细异常处理的可能性,例如检测特定文件/文件夹上的访问冲突…

rreeves代码的其他变体:

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

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

for(const QString &dirFile: dir.entryList()) {
  dir.remove(dirFile);
}
QDir目录(“/path/to/file”);

dir.setNameFilters(QStringList()为了改进@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;
const FileOperationResult removeesult=removeDirContents(路径);
如果(!removeResult.success)

qWarning()但我想使用QT,正如我在问题中所说的。我尝试了你的代码,但它只删除了一个文件,然后它一直在循环中运行,直到崩溃……你是对的。我得到了同样的结果。我为在发布之前没有测试它而感到羞愧。Luckilly rreeves在下面发布了一个修复程序。像个魔咒一样工作!:)使用通配符
“****”
有什么具体原因吗?如果我想删除所有文件,一个星号(如
“*”
)就足够了,对吗?当然,要明确删除扩展名为txt的文件,你应该使用
“*.txt”
而不是
“**”