诊断 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 上失败。

阅读 中的“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 ...)东西)。

【讨论】:

使用Qt的重点是保持代码跨平台(一次编写,到处运行)。 @VioletGiraffe 是跨平台的。另外,在 win 使用相同的参数 上有一个函数在 win 上工作并在 lin 上失败,这不是 corss 平台。 qt 或任何其他“跨平台”工具包都很棒,但只是作为最后的兼容层,如果你有一个标准库替代品,那就是你应该使用的【参考方案2】:

我遇到了同样的问题,但在 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期

故障诊断分析基于matlab FFT轴承故障诊断(包络谱)含Matlab源码 2002期

变频电源出现故障了怎么办,该如何去诊断呢

电脑故障起因与诊断

实时即未来,车联网项目之远程诊断实时故障分析

实时即未来,车联网项目之远程诊断实时故障分析