删除目录中的所有文件
Delete all files in a directory
我需要使用Qt删除目录中的所有文件。
目录中的所有文件都将具有扩展名".txt".
我不想删除目录本身。
有人知道我该怎么做吗?我看过QDir,但运气不佳。
Bjorns Answer被推到不会永远循环
QString path = "whatever";
QDir dir(path);
dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);
foreach(QString dirFile, dir.entryList())
{
dir.remove(dirFile);
}
忽略txt扩展过滤。。。以下是删除文件夹中所有内容的方法,包括非空子目录:
在QT5中,可以对目录使用removeCursively()。不幸的是,这会删除整个目录,而不仅仅是清空它。
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();
}
}
或者,您可以对要清除的目录使用removeCursively()(这将完全删除它)。然后,用相同的名字重新创建它。。。效果是一样的,但代码行数更少。然而,这个更详细的功能提供了更多的潜力,可以根据需要添加详细的异常处理,例如检测特定文件/文件夹的访问违规。。。
调用QDir::entryList(QDir:;Files)以获取目录中所有文件的列表,然后对于以".txt"结尾的每个fileName,调用QDir::remove(fileName)以删除该文件。
您以良好的方式开始,查看entryList,当然还可以传递所需的名称过滤器。
为了改进@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;
我会这样做:
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());
}
rreeves代码的其他变体:
QDir dir("/path/to/file");
dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);
for(const QString &dirFile: dir.entryList()) {
dir.remove(dirFile);
}
您可以在不使用Qt的情况下实现这一点:为此,opendir、readdir、unlink,甚至rmdir都将是您的朋友。它很容易使用,只需浏览手册页即可;)。
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- g++编译包含的头:没有这样的文件或目录
- cmake:添加要搜索头文件的目录
- 删除目录函数访问被拒绝
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 通过 g++ 运行程序时没有这样的文件或目录
- 致命错误:特征/密集:VSC 中没有此类文件或目录
- DirectX12 的问题:"d3dApp.h":没有这样的文件或目录
- 如何使用Windows API C++更改已创建的文件夹/目录安全权限
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 代码::块C++使用 MacOS 编译 Mojave : 致命错误: sys/cdefs.h: 没有这样的文件或目录
- 磁力计代码:C++ vs C - iosstream,矢量 - 错误iostream:没有这样的文件或目录
- OpenCV 安装错误:没有这样的文件或目录"pyopencv_generated_include.h"
- C++ 'speechapi_cxx.h':没有这样的文件或目录 Visual Studio
- gcc 找不到 -lgcc, g++.exe: 错误: 创建进程: 没有这样的文件或目录
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 查找并删除目录中的所有核心文件
- 删除目录中的所有文件