Нет способа сделать это только с помощью стандартной библиотеки; Стандарт C не знает каталогов. Тем не менее, у каждой ОС есть способ сделать это, поэтому вам нужно найти семейство ОС для вашей программы проверки (Windows, Linux и т. Д.) И посмотреть, как это сделать для этой ОС.
Библиотеки, встроенные в ОС, должны быть доступны, поскольку они поставляются вместе с системой. Вы не можете запустить любую программу вообще без них. (Технически это неверно, но достаточно точно, чтобы охватить все интересные случаи.)
РЕДАКТИРОВАТЬ: если ваша программа проверки работает под Windows (судя по вашим комментариям), вы захотите использовать FindFirstFile
и FindNextFile
. Тем не менее, они полагаются на дескрипторы (как и практически все API Windows), так что вам придется изучить это. (Дескриптор - это просто непрозрачный указатель, имеющий особое значение для ядра Windows. Вы можете рассматривать его почти как void *
. Не слишком зацикливайтесь на типе данных.)
РЕДАКТИРОВАТЬ 2: если вы ищете что-то для начала:
char ** list_directory (const char * directory) {
char * search_path = malloc(strlen(directory) + 3);
strcpy(search_path, directory);
strcat(search_path, "\\*");
WIN32_FIND_DATA fd;
SetLastError(0);
HANDLE hsrch = FindFirstFile(search_path, &fd);
free(search_path);
if (hsrch == INVALID_HANDLE_VALUE) {
if (GetLastError() != ERROR_FILE_NOT_FOUND) return NULL;
SetLastError(0);
return calloc(1, sizeof(char *)); // no files
}
char ** result = malloc(sizeof(char *));
unsigned count = 0;
while (!GetLastError()) {
result[count] = malloc(strlen(fd.cFileName) + 1);
strcpy(result[count ++], fd.cFileName);
FindNextFile(hsrch, &fd);
result = realloc(result, (count + 1) * sizeof(char *));
}
if (GetLastError() == ERROR_NO_MORE_FILES)
SetLastError(0);
FindClose(hsrch);
result[count] = NULL;
return result;
}