1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-18 16:32:32 +02:00

Use stat when dirent doesn't know file type

This commit is contained in:
Timmy Sjöstedt 2016-05-24 00:54:46 +02:00
parent f2ca6ed4d1
commit 3a3c8447aa

View File

@ -4,6 +4,7 @@
#include <algorithm>
#include <fstream>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
void FileIndex::indexDirectory(const std::string& directory)
@ -19,8 +20,17 @@ void FileIndex::indexDirectory(const std::string& directory)
realName = ep->d_name;
lowerName = realName;
std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), ::tolower);
if ( ep->d_type == DT_REG )
{
bool isRegularFile = false;
if (ep->d_type != DT_UNKNOWN) {
isRegularFile = ep->d_type == DT_REG;
} else {
std::string filepath = directory +"/"+ realName;
struct stat filedata;
if (stat(filepath.c_str(), &filedata) == 0) {
isRegularFile = S_ISREG(filedata.st_mode);
}
}
if (isRegularFile) {
files[ lowerName ] = {
lowerName,
realName,
@ -43,10 +53,20 @@ void FileIndex::indexTree(const std::string& root)
}
while( (ep = readdir(dp)) )
{
if( ep->d_type == DT_DIR && ep->d_name[0] != '.' )
{
std::string path = root + "/" + ep->d_name;
indexTree(path);
std::string filepath = root +"/"+ ep->d_name;
bool isDirectory = false;
if (ep->d_type != DT_UNKNOWN) {
isDirectory = ep->d_type == DT_DIR;
} else {
struct stat filedata;
if (stat(filepath.c_str(), &filedata) == 0) {
isDirectory = S_ISDIR(filedata.st_mode);
}
}
if (isDirectory && ep->d_name[0] != '.') {
indexTree(filepath);
}
}
closedir(dp);