4

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

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

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

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

4

3 回答 3

2

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

阅读 <unistd> 中的“rmdir”文档,此处为https://pubs.opengroup.org/onlinepubs/007904875/functions/rmdir.html,它说“如果路径参数引用的路径的最终组件是dot 或 dot-dot, rmdir() 将失败。 ”所以可能发生的是 QDir::rmdir() 正在调用 linux 中的 unistd rmdir() 函数,而这个函数以“.”失败。

我试图只使用完整的绝对路径( QDir::rmdir(absolutePath) )并且它有效;但是,我认为在 unistd 的 rmdir() 上使用 QDir::rmdir() 基本上没有意义,所以从现在开始我将坚持使用 unistd rmdir()。

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

于 2021-02-28T17:04:35.113 回答
1

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

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

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

于 2018-04-05T14:15:48.720 回答
0

尝试使用这个:

dir.rmdir(dir.absolutePath())
于 2014-02-11T14:14:29.920 回答