诊断QDir :: rmdir失败

时间:2013-09-08 09:54:02

标签: c++ linux qt rmdir qdir

我正在使用以下代码删除Linux上的空文件夹:

bool removeFolder (const QString& path)
{
   QDir dir(path);
   assert(dir.exists());
   return dir.rmdir(".");
}

由于某种原因,它有时会返回false(对于特定的文件夹,但这些文件夹似乎没有任何错误)。如果我随后使用<unistd.h>中的:: rmdir删除相同的文件夹,则会成功。  我怎么知道为什么QDir::rmdir失败?

到目前为止,这在Windows上从未发生过,QDir::rmdir只是有效。

3 个答案:

答案 0 :(得分:2)

确认:在windown上工作,在linux上失败。

阅读 中的“rmdir”文档,这里 https://pubs.opengroup.org/onlinepubs/007904875/functions/rmdir.html,它说“如果路径参数指的是最终组件是点或点点的路径,rmdir( ) 将失败。" 所以可能发生的事情是 QDir::rmdir() 在 linux 中调用 unistd rmdir() 函数,而这个函数以“.”失败。

我尝试只使用完整的绝对路径( QDir::rmdir(absolutePath) )并且它起作用了;然而,我认为在 unistd 的 rmdir() 上使用 QDir::rmdir() 基本上没有意义,所以从现在开始我会坚持使用 unistd rmdir()。

注意:QDir::removeRecursively() 是一个不同的故事:它似乎工作正常,而且它比通过 opendir() 然后连续的 readdir()(或 nftw(...FTW_DEPTH) 更方便...)东西)。

答案 1 :(得分:0)

尝试使用这个:

dir.rmdir(dir.absolutePath())

答案 2 :(得分:0)

我遇到了同样的问题,但在Windows上,我无法删除QDir().rmdir(path);的空目录。这发生在一些较旧的硬盘上,所以可能是古老的文件系统应该受到指责。但我找到了一个黑客:

QFile(path).setPermissions(QFile::WriteOther); // this works even for dirs
bool success = QDir().rmdir(path);

当然,如果删除不成功,您应该将权限还原为原始值,但这是一个不同的故事。