X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fmisc%2Fsg_dir.cxx;h=95929229a57a6b01647351d42ef45c4f548f1f13;hb=e4e31be7d43569a92a5d9fa7e784381b66cbd95a;hp=74b493edf95f8b07054b6d540816bf8bfff04641;hpb=fa169d6aa2ebb554e3a1a35417e1f4e001296763;p=simgear.git diff --git a/simgear/misc/sg_dir.cxx b/simgear/misc/sg_dir.cxx index 74b493ed..95929229 100644 --- a/simgear/misc/sg_dir.cxx +++ b/simgear/misc/sg_dir.cxx @@ -78,6 +78,12 @@ PathList Dir::children(int types, const std::string& nameFilter) const } if (fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + if (types & NO_DOT_OR_DOTDOT) { + if (!strcmp(fData.cFileName,".") || !strcmp(fData.cFileName,"..")) { + continue; + } + } + if (!(types & TYPE_DIR)) { continue; } @@ -100,6 +106,8 @@ PathList Dir::children(int types, const std::string& nameFilter) const return result; } + int filterLen = nameFilter.size(); + while (true) { struct dirent* entry = readdir(dp); if (!entry) { @@ -107,11 +115,18 @@ PathList Dir::children(int types, const std::string& nameFilter) const } // skip hidden files (names beginning with '.') unless requested - if (!(types & INCLUDE_HIDDEN) && (entry->d_name[0] == '.')) { + if (!(types & INCLUDE_HIDDEN) && (entry->d_name[0] == '.') && + strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { continue; } - - if (entry->d_type == DT_DIR) { + + SGPath f = file(entry->d_name); + if (!f.exists()) { + continue; // stat() failed + } + + if (f.isDir()) { + // directory handling if (!(types & TYPE_DIR)) { continue; } @@ -121,16 +136,24 @@ PathList Dir::children(int types, const std::string& nameFilter) const continue; } } - } else if (entry->d_type == DT_REG) { + } else if (f.isFile()) { + // regular file handling if (!(types & TYPE_FILE)) { continue; } } else { - continue; // ignore char/block devices, fifos, etc + // block device /fifo/char file, ignore + continue; } - + if (!nameFilter.empty()) { - if (strstr(entry->d_name, nameFilter.c_str()) == NULL) { + int nameLen = strlen(entry->d_name); + if (nameLen < filterLen) { + continue; // name is shorter than the filter + } + + char* nameSuffix = entry->d_name + (nameLen - filterLen); + if (strcmp(nameSuffix, nameFilter.c_str())) { continue; } } @@ -144,6 +167,11 @@ PathList Dir::children(int types, const std::string& nameFilter) const return result; } +bool Dir::exists() const +{ + return _path.isDir(); +} + SGPath Dir::file(const std::string& name) const { SGPath childPath = _path;