私のプロジェクトでは、ファイル名でフィルタリングされたユーザーのドライブ上のすべてのファイルをテキスト行で表示する必要があります。そのようなことをするためのAPIはありますか?
Windowsでは、WinAPIにFindFirstFile関数とFindNextFile関数があります。
私はC++/Qtを使用しています。
QtはQDirIteratorクラスを提供します。
QDirIterator iter("/", QDirIterator::Subdirectories);
while (iter.hasNext()) {
QString current = iter.next();
// Do something with 'current'...
}
Unixコマンドを探している場合は、次のようにすることができます。
find source_dir -name 'regex'
C ++スタイルで実行したい場合は、boost::filesystemを使用することをお勧めします。これは非常に強力なクロスプラットフォームライブラリです。
もちろん、ライブラリを追加する必要があります。
次に例を示します。
std::vector<std::string> list_files(const std::string& root, const bool& recursive, const std::string& filter, const bool& regularFilesOnly)
{
namespace fs = boost::filesystem;
fs::path rootPath(root);
// Throw exception if path doesn't exist or isn't a directory.
if (!fs::exists(rootPath)) {
throw std::exception("rootPath does not exist");
}
if (!fs::is_directory(rootPath)) {
throw std::exception("rootPath is not a directory.");
}
// List all the files in the directory
const std::regex regexFilter(filter);
auto fileList = std::vector<std::string>();
fs::directory_iterator end_itr;
for( fs::directory_iterator it(rootPath); it != end_itr; ++it) {
std::string filepath(it->path().string());
// For a directory
if (fs::is_directory(it->status())) {
if (recursive && it->path().string() != "..") {
// List the files in the directory
auto currentDirFiles = list_files(filepath, recursive, filter, regularFilesOnly);
// Add to the end of the current vector
fileList.insert(fileList.end(), currentDirFiles.begin(), currentDirFiles.end());
}
} else if (fs::is_regular_file(it->status())) { // For a regular file
if (filter != "" && !regex_match(filepath, regexFilter)) {
continue;
}
} else {
// something else
}
if (regularFilesOnly && !fs::is_regular_file(it->status())) {
continue;
}
// Add the file or directory to the list
fileList.push_back(filepath);
}
return fileList;
}
glob
http://man7.org/linux/man-pages/man3/glob.3.html
は、POSIXの一部であるため、多くのUnices(確かにSolaris)に存在するという利点があります。
わかりました。C++ではなく純粋なCです。
見てくださいman find
。find
マスクによるフィルタリングをサポート(例の-name
オプション)