在某些rm命令实现中,采用的是如下的伪代码逻辑,这在一些文件系统(例如yaffs2)上是不严谨的,存在文件删除不干净的问题。

1
2
3
4
opendir();
while (readdir())
    unlink();
closedir();

出现这种问题的原因是在遍历文件目录的过程中,如果删除了一些文件,**readdir()**的返回结果是不可预期的,可能导致while循环提前结束,从而遗留了一些文件。

这个问题是和具体的文件系统相关的,yaffs2上可能会出现,ext4似乎不会。

解决办法有2个

  • 如果存在删除操作,调用rewinddir()更新

    opendir(); do { unlinkedfiles = 0; while(readdir()) { unlink(); unlinkedfiles = 1; } if (unlinkedfiles) rewinddir(); } while (unlinkedfiles); closedir();

  • 使用fts API重写,这是netbsd的文件管理API,不存在上述问题

调查发现,android上的rm在5.0版本以后已经改用fts API实现,GNU tools目前也已经迁移到了fts实现,busybox还是老的实现,所以才会出现busybox rm命令删不干净文件夹的现象。