Чтобы узнать, как связать вызовы с opendir
, вы можете найти множество ответов здесь, на SO, например, this . Используйте ent->d_type
, чтобы проверить, является ли запись каталогом или файлом.
Чтобы открыть файл в каталоге, просто используйте путь в ent->d_name
, чтобы создать путь для вызова fopen
.
Редактировать Было немного скучно на работе, и он сделал функцию, подобную той, которую вы, возможно, хотите ...
#ifdef _WIN32
# define DIR_SEPARATOR "\\"
#else
# define DIR_SEPARATOR "/"
#endif
void my_readdir(const char *path)
{
DIR *dir = opendir(path);
if (dir != NULL)
{
struct dirent *ent;
static const char filtername[] = "filter.txt";
/* +2: One for directory separator, one for string terminator */
char *filename = (char *) malloc(strlen(path) + strlen(filtername) + 2);
strcpy(filename, path);
strcat(filename, DIR_SEPARATOR);
strcat(filename, filtername);
FILE *fp = fopen(filename, "a");
while ((ent = readdir(dir)) != NULL)
{
if (ent->d_type == DT_REG || ent->d_type == DT_DIR)
{
if (strcmp(ent->d_name, "..") != 0 && strcmp(ent->d_name, ".") != 0)
{
if (fp != NULL)
fprintf(fp, "%s : %s\n", (ent->d_type == DT_REG ? "File" : "Directory"), ent->d_name);
if (ent->d_type == DT_DIR)
{
/* +2: One for directory separator, one for string terminator */
char *newpath = (char *) malloc(strlen(path) + strlen(ent->d_name) + 2);
strcpy(newpath, path);
strcat(newpath, DIR_SEPARATOR);
strcat(newpath, ent->d_name);
/* Call myself recusively */
my_readdir(newpath);
free(newpath);
}
}
}
}
if (fp != NULL)
fclose(fp);
free(filename);
}
}
Редактировать Кажется, что функции opendir
и readdir
не очень хорошо поддерживаются в Windows. Используйте FindFirstFile
и FindNextFile
только для Windows аналогично моему примеру выше. См. эту страницу MSDN для примера использования этих функций.