refactor file and assets search
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user