Much shorter version of Dir::isEmpty()

This commit is contained in:
Erik Hofman 2016-07-03 09:35:03 +02:00
parent b23e9a3424
commit 82a9491de4

View File

@ -271,54 +271,20 @@ PathList Dir::children(int types, const std::string& nameFilter) const
bool Dir::isEmpty() const bool Dir::isEmpty() const
{ {
bool empty= true;
std::string ps = _path.local8BitStr(); std::string ps = _path.local8BitStr();
#ifdef _WIN32 #ifdef _WIN32
ps += "\\*"; return PathIsDirectoryEmpty( ps.c_str() );
WIN32_FIND_DATA fData;
HANDLE find = FindFirstFile(ps.c_str(), &fData);
if (find == INVALID_HANDLE_VALUE) {
return true;
}
// since an empty dir will still have . and .. children, we need
// watch for those - anything else means the dir is really non-empty
bool done = false;
for (; !done; done = (FindNextFile(find, &fData) == 0)) {
if (fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (!strcmp(fData.cFileName,".") || !strcmp(fData.cFileName,"..")) {
continue;
}
}
empty = false;
break;
}
FindClose(find);
#else #else
DIR* dp = opendir( ps.c_str() );
if (!dp) return true;
DIR* dp = opendir(ps.c_str()); int n = 0;
if (!dp) { dirent* d;
return true; while( (d = readdir(dp)) !=NULL ) n++;
}
while (true) {
struct dirent* entry = readdir(dp);
if (!entry) {
break; // done iteration
}
if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) {
continue;
}
empty = false;
break;
}
closedir(dp); closedir(dp);
return (n == 2); // '.' and '..' always exist
#endif #endif
return empty;
} }
bool Dir::exists() const bool Dir::exists() const