Количество файлов с данным расширением в каталоге - C ++?
-
20-09-2019 - |
Вопрос
Возможно ли в C ++ подсчитать количество файлов с заданным расширением в каталоге?
Я пишу программу, где было бы неплохо сделать что-то подобное (псевдокод):
if (file_extension == ".foo")
num_files++;
for (int i = 0; i < num_files; i++)
// do something
Очевидно, что эта программа гораздо сложнее, но это должно дать вам общее представление о том, что я пытаюсь сделать.
Если это невозможно, просто скажите мне.
Спасибо!
Решение
В C или C ++ нет ничего стандарты сами об обращении с каталогами, но почти любая ОС, стоимость которой солеет, будет такого зверя, одним из примеров является findfirst/findnext
функции или readdir
.
То, как вы делаете это, является простой петлей по этим функциям, проверяя конец струн, возвращаемых для расширения, которое вы хотите.
Что-то типа:
char *fspec = findfirst("/tmp");
while (fspec != NULL) {
int len = strlen (fspec);
if (len >= 4) {
if (strcmp (".foo", fspec + len - 4) == 0) {
printf ("%s\n", fspec);
}
}
fspec = findnext();
}
Как указано, фактические функции, которые вы будете использовать для прохождения каталога, являются специфичными для ОС.
Для Unix это почти наверняка будет использованием opendir, Риддир а также закрытый. Анкет Этот код является хорошей отправной точкой для этого:
#include <dirent.h>
int len;
struct dirent *pDirent;
DIR *pDir;
pDir = opendir("/tmp");
if (pDir != NULL) {
while ((pDirent = readdir(pDir)) != NULL) {
len = strlen (pDirent->d_name);
if (len >= 4) {
if (strcmp (".foo", &(pDirent->d_name[len - 4])) == 0) {
printf ("%s\n", pDirent->d_name);
}
}
}
closedir (pDir);
}
Другие советы
Этот вид функциональности является специфичным для ОС, поэтому нет стандартного, портативного метода этого.
Однако использование Библиотека файловых систем Boost Вы можете сделать это, и гораздо больше операций, связанных с файловой системой в портативной манере.
Прежде всего, какую ОС вы пишете?
- Если это окна, то ищите
FindFirstFile
а такжеFindNextFile
в MSDN. - Если вы ищете код для систем POSIX, прочитайте
man
заopendir
а такжеreaddir
или жеreaddir_r
. - Для кросс -платформы я бы предложил использовать библиотеку Boost.filesystem.