诊断 QDir::rmdir 故障
Posted
技术标签:
【中文标题】诊断 QDir::rmdir 故障【英文标题】:Diagnosing QDir::rmdir failure 【发布时间】:2013-09-08 09:54:01 【问题描述】:我正在使用以下代码在 Linux 上删除一个空文件夹:
bool removeFolder (const QString& path)
QDir dir(path);
assert(dir.exists());
return dir.rmdir(".");
由于某种原因,它有时会返回 false(对于特定文件夹,但这些文件夹似乎没有任何错误)。如果我随后使用 <unistd.h>
中的 ::rmdir 删除同一个文件夹,它会成功。
我怎么知道为什么QDir::rmdir
失败了?
到目前为止,这在 Windows 上从未发生过,QDir::rmdir
可以正常工作。
【问题讨论】:
检查你的目录是否真的是空的。没有隐形文件?临时工?像流浪.nfs这样的东西??????文件? @Greenflow:完全是空的。我不相信rmdir
也不能容忍非空目录,这很好用。我也有assert(dir.entryList(QDir::NoDotAndDotDot | QDir::Hidden | QDir::System).isEmpty())
,它永远不会触发。
好的,我想到了删除文件和你的目录之间的竞争条件,但你的断言使得这不太可能。
使用dir.rmdir(path);
而不是dir.rmdir(".");
会有什么不同吗?不明白为什么应该这样做。但我也不明白为什么它会失败。
@Greenflow:所以我有一个无法删除的文件夹“”/home/alex/Development/krusader/.git/branches”。相反,我构建了QDir dir("/home/alex/Development/krusader/.git")
并调用了@ 987654330@. 还是失败了。
【参考方案1】:
确认:在 windows 上工作,在 linux 上失败。
阅读
我尝试只使用完整的绝对路径( QDir::rmdir(absolutePath) )并且它有效;但是,我认为在 unistd 的 rmdir() 之上使用 QDir::rmdir() 基本上没有意义,所以从现在开始我将坚持使用 unistd rmdir()。
注意:QDir::removeRecursively() 是一个不同的故事:它似乎工作得很好,而且它比通过 opendir() 然后连续 readdir() 更方便(或 nftw(...FTW_DEPTH ...)东西)。
【讨论】:
使用Qt的重点是保持代码跨平台(一次编写,到处运行)。 @VioletGiraffe我遇到了同样的问题,但在 Windows 上,我无法使用 QDir().rmdir(path);
删除空目录。这发生在一些较旧的硬盘驱动器上,因此可能是古老的文件系统造成的。但我发现了一个 hack:
QFile(path).setPermissions(QFile::WriteOther); // this works even for dirs
bool success = QDir().rmdir(path);
当然,如果删除仍然不成功,您应该将权限恢复为原始值,但那是另一回事。
【讨论】:
【参考方案3】:尝试使用这个:
dir.rmdir(dir.absolutePath())
【讨论】:
以上是关于诊断 QDir::rmdir 故障的主要内容,如果未能解决你的问题,请参考以下文章
故障诊断分析基于matlab FFT轴承故障诊断含Matlab源码 2001期