Files
BlitzNext/Runtime/gfx/gxfilesystem.cpp
T
2019-01-18 19:05:43 +01:00

107 lines
2.2 KiB
C++

#include "gxfilesystem.hpp"
#include <set>
static std::set<gxDir*> dir_set;
gxFileSystem::gxFileSystem()
{
dir_set.clear();
}
gxFileSystem::~gxFileSystem()
{
while (dir_set.size())
closeDir(*dir_set.begin());
}
bool gxFileSystem::createDir(const std::string& dir)
{
return CreateDirectory(dir.c_str(), 0) ? true : false;
}
bool gxFileSystem::deleteDir(const std::string& dir)
{
return RemoveDirectory(dir.c_str()) ? true : false;
}
bool gxFileSystem::createFile(const std::string& file)
{
return false;
}
bool gxFileSystem::deleteFile(const std::string& file)
{
return DeleteFile(file.c_str()) ? true : false;
}
bool gxFileSystem::copyFile(const std::string& src, const std::string& dest)
{
return CopyFile(src.c_str(), dest.c_str(), false) ? true : false;
}
bool gxFileSystem::renameFile(const std::string& src, const std::string& dest)
{
return MoveFile(src.c_str(), dest.c_str()) ? true : false;
}
bool gxFileSystem::setCurrentDir(const std::string& dir)
{
return SetCurrentDirectory(dir.c_str()) ? true : false;
}
std::string gxFileSystem::getCurrentDir() const
{
char buff[MAX_PATH];
if (!GetCurrentDirectory(MAX_PATH, buff))
return "";
std::string t = buff;
if (t.size() && t[t.size() - 1] != '\\')
t += '\\';
return t;
}
int gxFileSystem::getFileSize(const std::string& name) const
{
WIN32_FIND_DATA findData;
HANDLE h = FindFirstFile(name.c_str(), &findData);
if (h == INVALID_HANDLE_VALUE)
return 0;
int n = findData.dwFileAttributes, sz = findData.nFileSizeLow;
FindClose(h);
return n & FILE_ATTRIBUTE_DIRECTORY ? 0 : sz;
}
int gxFileSystem::getFileType(const std::string& name) const
{
DWORD t = GetFileAttributes(name.c_str());
return t == -1 ? FILE_TYPE_NONE : (t & FILE_ATTRIBUTE_DIRECTORY ? FILE_TYPE_DIR : FILE_TYPE_FILE);
}
gxDir* gxFileSystem::openDir(const std::string& name, int flags)
{
std::string t = name;
if (t[t.size() - 1] == '\\')
t += "*";
else
t += "\\*";
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile(t.c_str(), &f);
if (h != INVALID_HANDLE_VALUE) {
gxDir* d = new gxDir(h, f);
dir_set.insert(d);
return d;
}
return 0;
}
gxDir* gxFileSystem::verifyDir(gxDir* d)
{
return dir_set.count(d) ? d : 0;
}
void gxFileSystem::closeDir(gxDir* d)
{
if (dir_set.erase(d))
delete d;
}