113 lines
2.8 KiB
C++
113 lines
2.8 KiB
C++
#include "hpath.h"
|
|
|
|
#include "hplatform.h"
|
|
|
|
bool HPath::exists(const char* path) {
|
|
return access(path, 0) == 0;
|
|
}
|
|
|
|
bool HPath::isdir(const char* path) {
|
|
if (access(path, 0) != 0) return false;
|
|
struct stat st;
|
|
memset(&st, 0, sizeof(st));
|
|
stat(path, &st);
|
|
return S_ISDIR(st.st_mode);
|
|
}
|
|
|
|
bool HPath::isfile(const char* path) {
|
|
if (access(path, 0) != 0) return false;
|
|
struct stat st;
|
|
memset(&st, 0, sizeof(st));
|
|
stat(path, &st);
|
|
return S_ISREG(st.st_mode);
|
|
}
|
|
|
|
bool HPath::islink(const char* path) {
|
|
#ifdef OS_WIN
|
|
return HPath::isdir(path) && (GetFileAttributesA(path) & FILE_ATTRIBUTE_REPARSE_POINT);
|
|
#else
|
|
if (access(path, 0) != 0) return false;
|
|
struct stat st;
|
|
memset(&st, 0, sizeof(st));
|
|
lstat(path, &st);
|
|
return S_ISLNK(st.st_mode);
|
|
#endif
|
|
}
|
|
|
|
std::string HPath::basename(const std::string& filepath) {
|
|
std::string::size_type pos1 = filepath.find_last_not_of("/\\");
|
|
if (pos1 == std::string::npos) {
|
|
return "/";
|
|
}
|
|
std::string::size_type pos2 = filepath.find_last_of("/\\", pos1);
|
|
if (pos2 == std::string::npos) {
|
|
pos2 = 0;
|
|
} else {
|
|
pos2++;
|
|
}
|
|
|
|
return filepath.substr(pos2, pos1-pos2+1);
|
|
}
|
|
|
|
std::string HPath::dirname(const std::string& filepath) {
|
|
std::string::size_type pos1 = filepath.find_last_not_of("/\\");
|
|
if (pos1 == std::string::npos) {
|
|
return "/";
|
|
}
|
|
std::string::size_type pos2 = filepath.find_last_of("/\\", pos1);
|
|
if (pos2 == std::string::npos) {
|
|
return ".";
|
|
} else if (pos2 == 0) {
|
|
pos2 = 1;
|
|
}
|
|
|
|
return filepath.substr(0, pos2);
|
|
}
|
|
|
|
std::string HPath::filename(const std::string& filepath) {
|
|
std::string::size_type pos1 = filepath.find_last_of("/\\");
|
|
if (pos1 == std::string::npos) {
|
|
pos1 = 0;
|
|
} else {
|
|
pos1++;
|
|
}
|
|
std::string file = filepath.substr(pos1);
|
|
|
|
std::string::size_type pos2 = file.find_last_of(".");
|
|
if (pos2 == std::string::npos) {
|
|
return file;
|
|
}
|
|
return file.substr(0, pos2);
|
|
}
|
|
|
|
std::string HPath::suffixname(const std::string& filepath) {
|
|
std::string::size_type pos1 = filepath.find_last_of("/\\");
|
|
if (pos1 == std::string::npos) {
|
|
pos1 = 0;
|
|
} else {
|
|
pos1++;
|
|
}
|
|
std::string file = filepath.substr(pos1);
|
|
|
|
std::string::size_type pos2 = file.find_last_of(".");
|
|
if (pos2 == std::string::npos) {
|
|
return "";
|
|
}
|
|
return file.substr(pos2+1);
|
|
}
|
|
|
|
std::string HPath::join(const std::string& dir, const std::string& filename) {
|
|
char separator = '/';
|
|
#ifdef OS_WIN
|
|
if (dir.find_first_of("\\") != std::string::npos) {
|
|
separator = '\\';
|
|
}
|
|
#endif
|
|
std::string filepath(dir);
|
|
if (dir[dir.length()-1] != separator) {
|
|
filepath += separator;
|
|
}
|
|
filepath += filename;
|
|
return filepath;
|
|
}
|