diff options
author | Andrei Karas <akaras@inbox.ru> | 2017-04-24 17:04:47 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2017-04-24 17:04:47 +0300 |
commit | d1b635ebf238fac5911fde8982d067ee4ffffe3a (patch) | |
tree | 788b6c6733550f5a54d5b3552a909a141af1223c /src/fs/virtfs/virtfsdir.cpp | |
parent | 0835e09ee3a6c83ffa01454f2c05597e6195b07d (diff) | |
download | manaplus-d1b635ebf238fac5911fde8982d067ee4ffffe3a.tar.gz manaplus-d1b635ebf238fac5911fde8982d067ee4ffffe3a.tar.bz2 manaplus-d1b635ebf238fac5911fde8982d067ee4ffffe3a.tar.xz manaplus-d1b635ebf238fac5911fde8982d067ee4ffffe3a.zip |
Improve VirtFs::getDirs.
Diffstat (limited to 'src/fs/virtfs/virtfsdir.cpp')
-rw-r--r-- | src/fs/virtfs/virtfsdir.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/fs/virtfs/virtfsdir.cpp b/src/fs/virtfs/virtfsdir.cpp index 2d165195e..967c80610 100644 --- a/src/fs/virtfs/virtfsdir.cpp +++ b/src/fs/virtfs/virtfsdir.cpp @@ -138,6 +138,7 @@ namespace VirtFsDir ptr->openAppend = &VirtFsDir::openAppend; ptr->loadFile = &VirtFsDir::loadFile; ptr->getFiles = &VirtFsDir::getFiles; + ptr->getDirs = &VirtFsDir::getDirs; ptr->rwops_seek = &VirtFsDir::rwops_seek; ptr->rwops_read = &VirtFsDir::rwops_read; ptr->rwops_write = &VirtFsDir::rwops_write; @@ -562,4 +563,52 @@ namespace VirtFsDir } } + void getDirs(VirtFsEntry *restrict const entry, + const std::string &dirName, + StringVect &names) + { + const std::string path = entry->root + dirName; + const struct dirent *next_file = nullptr; + DIR *const dir = opendir(path.c_str()); + if (dir) + { + while ((next_file = readdir(dir))) + { + struct stat statbuf; + const std::string file = next_file->d_name; + if (file == "." || file == "..") + continue; +#ifndef WIN32 + if (mPermitLinks == false) + { + if (lstat(path.c_str(), &statbuf) == 0 && + S_ISLNK(statbuf.st_mode) != 0) + { + continue; + } + } +#endif // WIN32 + + const std::string filePath = pathJoin(path, file); + if (stat(filePath.c_str(), &statbuf) == 0) + { + if (S_ISDIR(statbuf.st_mode) == 0) + continue; + } + + bool found(false); + FOR_EACH (StringVectCIter, itn, names) + { + if (*itn == file) + { + found = true; + break; + } + } + if (found == false) + names.push_back(file); + } + closedir(dir); + } + } } // namespace VirtFs |