// // Copyright (c) 2009-2010 Mikko Mononen memon@inside.org // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would be // appreciated but is not required. // 2. Altered source versions must be plainly marked as such, and must not be // misrepresented as being the original software. // 3. This notice may not be removed or altered from any source distribution. // #include "Filelist.h" #include #ifdef WIN32 # include #else # include # include #endif bool tryReadFile(const std::string& path, char** outBuffer, size_t* outBufferLen) { FILE* file = fopen(path.c_str(), "rb"); if (!file) { return false; } if (fseek(file, 0, SEEK_END) != 0) { (void)fclose(file); return false; } const int fileSize = ftell(file); if (fileSize < 0) { (void)fclose(file); return false; } *outBufferLen = fileSize; if (fseek(file, 0, SEEK_SET) != 0) { (void)fclose(file); return false; } *outBuffer = new char[*outBufferLen]; const size_t readLen = fread(*outBuffer, *outBufferLen, 1, file); (void)fclose(file); if (readLen != 1) { delete[] *outBuffer; *outBuffer = nullptr; return false; } return true; } void scanDirectory(const std::string& path, const std::string& ext, std::vector& filelist) { #ifdef WIN32 std::string pathWithExt = path + "/*" + ext; _finddata_t dir; intptr_t findHandle = _findfirst(pathWithExt.c_str(), &dir); if (findHandle == -1L) { return; } do { filelist.emplace_back(dir.name); } while (_findnext(findHandle, &dir) == 0); _findclose(findHandle); #else dirent* current = 0; DIR* dp = opendir(path.c_str()); if (!dp) { return; } size_t extLen = strlen(ext.c_str()); while ((current = readdir(dp)) != 0) { size_t len = strlen(current->d_name); if (len > extLen && strncmp(current->d_name + len - extLen, ext.c_str(), extLen) == 0) { filelist.emplace_back(current->d_name); } } closedir(dp); #endif // Sort the list of files alphabetically. std::sort(filelist.begin(), filelist.end()); }