诊断 QDir::rmdir 故障

Diagnosing QDir::rmdir failure

本文关键字:故障 rmdir 诊断 QDir      更新时间:2023-10-16

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

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

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

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

确认:在 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...东西)。

我遇到了同样的问题,但在 Windows 上,我无法使用 QDir().rmdir(path); 删除空目录。这发生在一些较旧的硬盘驱动器上,因此可能是古老的文件系统的罪魁祸首。但我发现了一个黑客:

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

当然,如果删除不成功,您应该将权限恢复为原始值,但那是另一回事。

尝试使用这个:

dir.rmdir(dir.absolutePath())