source/util/FilesystemUtil.h (76 lines of code) (raw):

/** * Copyright 2004-present Facebook. All Rights Reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ #pragma once #ifdef WIN32 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include <experimental/filesystem> // C++-standard header file name #include <filesystem> // Microsoft-specific implementation header file name #else #define BOOST_FILESYSTEM_NO_DEPRECATED #include <boost/filesystem.hpp> #endif #include <glog/logging.h> namespace filesystem { #ifdef WIN32 using namespace std::experimental::filesystem; #else using namespace boost::filesystem; #endif inline bool isHidden(const path& p) { return p.filename().string()[0] == '.'; } inline path getFirstFile( const path& dir, const bool includeHidden = true, const bool exceptOnEmpty = true, const std::string extension = "", const std::string ignoreExtension = "") { path res = ""; auto directoryContents = recursive_directory_iterator(dir); for (const directory_entry& entry : directoryContents) { if (is_regular_file(entry) && (includeHidden || !isHidden(entry.path()))) { const path p = entry.path(); if ((extension.empty() || p.extension().string() == extension) && (ignoreExtension.empty() || p.extension().string() != ignoreExtension)) { return p; } } } CHECK(!exceptOnEmpty) << "Could not find files in " << dir; return res; } inline std::vector<path> getFilesSorted(const path& dir, const bool includeHidden = true) { std::vector<path> result; for (const directory_entry& entry : directory_iterator(dir)) { if (is_regular_file(entry) && (includeHidden || !isHidden(entry.path()))) { result.push_back(entry.path()); } } std::sort(result.begin(), result.end()); return result; } inline std::vector<path> getVisibleFilesSorted(const path& dir) { return getFilesSorted(dir, false); } inline std::vector<std::string> getVisibleFilenamesSorted(const path& dir) { const std::vector<path> paths = getFilesSorted(dir, false); std::vector<std::string> filenames; for (const path& p : paths) { filenames.push_back(p.filename().string()); } return filenames; } inline std::vector<path> getDirectoriesSorted(const path& dir) { std::vector<path> result; for (const directory_entry& entry : directory_iterator(dir)) { if (is_directory(entry)) { result.push_back(entry.path()); } } std::sort(result.begin(), result.end()); return result; } // Obtains file extension from first file inside given directory inline const std::string getFirstExtension(const filesystem::path& dir) { const std::vector<filesystem::path> paths = getVisibleFilesSorted(dir); CHECK_GT(paths.size(), 0) << "no visible files in " << dir; return paths[0].extension().string(); } } // namespace filesystem