refactor file and assets search

This commit is contained in:
2017-08-10 13:46:54 +01:00
parent b218daeb2e
commit 5bc9d443bc
5 changed files with 73 additions and 50 deletions

View File

@@ -10,6 +10,73 @@
AAssetManager* Asset::m_am;
#endif
std::vector<std::string> Asset::list_files(std::string folder, bool is_asset, const std::string& filter_regex)
{
std::vector<std::string> names;
#ifdef _WIN32
WIN32_FIND_DATAA fd;
HANDLE hFind = ::FindFirstFileA((folder + "*").c_str(), &fd);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
// read all (real) files in current folder
// , delete '!' read other 2 default folder . and ..
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
names.push_back(fd.cFileName);
}
} while (::FindNextFileA(hFind, &fd));
::FindClose(hFind);
}
#elif __ANDROID__
if (is_asset)
{
AAssetDir* dir = AAssetManager_openDir(Asset::m_am, folder.c_str());
while (const char* name = AAssetDir_getNextFileName(dir))
{
//LOG("asset: %s", name);
names.push_back(name);
}
AAssetDir_close(dir);
}
else
{
}
#else
if (is_asset)
{
NSString* bundle_path = [[NSBundle mainBundle] resourcePath];
std::string base = [bundle_path cStringUsingEncoding : 1];
std::string abs_path = base + "/" + folder;
}
DIR *dp;
struct dirent *ep;
dp = opendir(abs_path.c_str());
if (dp != NULL)
{
while ((ep = readdir(dp)))
if (ep->d_type != DT_DIR)
names.push_back(ep->d_name);
closedir(dp);
}
else
LOG("Couldn't open the directory: %s", folder.c_str());
#endif
if (!filter_regex.empty())
{
std::regex r(filter_regex);
names.erase(std::remove_if(names.begin(), names.end(),
[&r](const std::string& s) { return !std::regex_match(s, r); }), names.end());
}
return names;
}
bool Asset::open(const char* path)
{
LOG("Asset::open %s", path);