Как найти все имена файлов в определенном каталоге, не используя "dirent.h" (окна Visual Studio 2017) в C - PullRequest
0 голосов
/ 24 мая 2019

У меня есть проект в середине семестра, чтобы создать антивирус, который получает в качестве основных аргументов каталог и путь: Путь к файлу, который содержит сигнатуру вируса. Целью антивируса является проверка всех файлов в данном каталоге на наличие сигнатур вирусов. Я закончил весь проект, кроме той части, которая находит все файлы в определенном каталоге. Поскольку этот проект проверяется системой автоматической обратной связи, которая не имеет каких-либо внешних библиотек и работает в неизвестной операционной системе (даже мой преподаватель не знает, это система курса), он должен быть кроссплатформенным решением, которое не зависит ни от каких библиотек, кроме stdio.h, stdlib.h, string.h и windows.h

Практически в каждом уроке и примере это делается с помощью HANDLE (который мы еще не изучили и не должны использовать) или с помощью. Проблема в том, чтобы найти способ сделать это без библиотеки directnt.

Мне нужна функция, которая получает все файлы в каталоге

Примерно так:

char** fileNames = somefunc(char* dir)

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Нет способа сделать это только с помощью стандартной библиотеки; Стандарт 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;
}
1 голос
/ 24 мая 2019

Заголовок dirent.h представляет собой реализацию обходных каталогов в POSIX, то есть он работает только в UNIX-подобных системах.Для Windows вы должны использовать функции _findfirst и _findnext, как указано здесь .В отличие от FindFirstFile и FindNextFile они не используют HANDLE.

Например:

intptr_t ffhandle;
struct _finddata_t ffinfo;

if ((ffhandle = _findfirst("c:\\path\\to\\dir\\*.*", &ffinfo)) == -1) {
    perror("findfirst failed");
    exit(1);
}
do {
    printf("found file %s\n", ffinfo.name);
} while (_findnext(ffhandle, &ffinfo) == 0);
_findclose(ffhandle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...