我需要使用Qt删除目录中的所有文件。
目录中的所有文件都将具有扩展名“.txt”。
我不想删除目录本身。
有谁知道我怎么做到这一点?我看过QDir,但没有运气。
答案 0 :(得分:45)
Bjorns回答说不要永远循环
QString path = "whatever";
QDir dir(path);
dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);
foreach(QString dirFile, dir.entryList())
{
dir.remove(dirFile);
}
答案 1 :(得分:8)
忽略txt扩展名过滤...这是一种删除文件夹中所有内容的方法,包括非空子目录:
在QT5中,您可以在dirs上使用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()(这将完全删除它)。然后,在此之后使用相同的名称重新创建它...效果将是相同的,但代码行数较少。然而,这种更详细的功能提供了更多的可能性,如果需要,可以添加详细的异常处理,例如,检测特定文件/文件夹的访问冲突......
答案 2 :(得分:5)
调用QDir :: entryList(QDir :: Files)获取目录中所有文件的列表,然后以“.txt”结尾的每个fileName调用QDir :: remove(fileName)删除文件
答案 3 :(得分:1)
你开始了一个很好的方式,看看entryList,然后传递你想要的名字过滤器。
答案 4 :(得分: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());
}
答案 5 :(得分:0)
rreeves代码的其他变体:
QDir dir("/path/to/file");
dir.setNameFilters(QStringList() << "*.*");
dir.setFilter(QDir::Files);
for(const QString &dirFile: dir.entryList()) {
dir.remove(dirFile);
}
答案 6 :(得分:0)
为了改进@user3191791 的答案(删除所有文件和目录),这个答案:
代码:
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;
答案 7 :(得分:-3)
你可以在不使用Qt的情况下实现这一点:这样做,opendir,readdir,unlink,甚至rmdir将成为你的朋友。它易于使用,只需浏览手册页;)。