sersync在xfs文件系统下无法递归监控文件子目录,经过调试发现,xfs文件系统下,readdir无法获取dirent 数据结构的d_type,或者说无论是文件还是目录,获取的d_type类型都为文件。

在大部分linux系统中,获取目录下的文件及其类型代码如下:

DIR* pdir = NULL;struct dirent *pfile = NULL;if (!(pdir = opendir(path.c_str()))) return false;while ((pfile = readdir(pdir))) //read directory content and add recursively{if (pfile->d_type==4 && strcmp(pfile->d_name, ".") && strcmp(pfile->d_name, "..")){.....//当读出的为目录时进行处理}}

在ext3 nfs ext4文件系统下,上面代码工作正常,当 pfile->d_type == 4 (为目录的时候)进行相应的处理。但在xfs下,无法正确读取d_type。所以采取另一种方法来处理:

bool IsDir(std::string path){struct stat sb;if (stat(path.c_str(), &sb) == -1) return false;return S_ISDIR(sb.st_mode);}DIR* pdir = NULL;struct dirent *pfile = NULL;if (!(pdir = opendir(path.c_str()))) return false;while ((pfile = readdir(pdir))) //read directory content and add recursively{string pre = path + "/" + pfile->d_name;if (IsDir(pre) && strcmp(pfile->d_name, ".") && strcmp(pfile->d_name, "..")){.....//当读出的为目录时进行处理}}

这样做效率会低一些,据说批量处理时候,每一次判断文件类型花费是0.5ms,这与直接读出文件类型的地一种方法相差很多,但还在可以接受的范围内