Skip to content

Instantly share code, notes, and snippets.

@anytizer
Created June 12, 2023 23:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anytizer/035b3c15403591b9110558124d3924b6 to your computer and use it in GitHub Desktop.
Save anytizer/035b3c15403591b9110558124d3924b6 to your computer and use it in GitHub Desktop.
SamplesScanner
#pragma once
/**
* Purpose: Deep scan directories for a search pattern in known file extensions.
*
* Usage:
*
* SamplesScanner sc = SamplesScanner();
* QString path = "D:\\lmms\\build\\Debug\\data\\samples";
* QString pattern = "*.ds";
* QString search = "rave"; // D:/lmms/build/Debug/data/samples/drumsynth/misc_synth/raver_organ.ds
* QList<QString> samples_files = sc.scan(path, pattern, search);
*/
#include <QDir>
#include <iostream>
class SamplesScanner
{
private:
QList<QString> samples(QString path, QString pattern);
public:
SamplesScanner();
QList<QString> scan(QString path, QString pattern, QString search);
};
SamplesScanner::SamplesScanner()
{
}
QList<QString> SamplesScanner::scan(QString path, QString pattern, QString search)
{
QList<QString> searchlist = QList<QString>();
QList<QString> samples = this->samples(path, pattern);
for (QString sample : samples)
{
QFileInfo info = QFileInfo(sample);
//if (sample.contains(search)) // will search in full path: not expected.
if (info.baseName().contains(search)) // search in deep file name only
{
std::cout << "\r\n Found dir: " << sample.toStdString();
searchlist.append(sample);
}
}
return searchlist;
}
QList<QString> SamplesScanner::samples(QString path, QString pattern)
{
QList<QString> samples = QList<QString>();
QDir dir = QDir(path);
//QString pattern = "*.ogg"; // *.ogg, *.wav, *.ds, *.flac
dir.setNameFilters(QStringList(pattern));
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::AllDirs);
QStringList files = dir.entryList();
for (int i = 0; i < files.count(); ++i)
{
QString name = path + "/" + files[i];
QFileInfo info = QFileInfo(name);
if (info.isDir())
{
QList<QString> samples1 = this->samples(name, pattern);
for (QString dir : samples1)
{
samples.append(dir);
}
}
else
{
samples.append(info.absoluteFilePath());
}
}
return samples;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment