0

我有一个期中项目,要制作一个防病毒软件,它以目录和路​​径作为主要参数:路径是指向包含病毒签名的文件。防病毒软件的目标是扫描给定目录中的所有文件以查找病毒签名。我已经完成了整个项目,除了在特定给定目录中找到所有文件的部分。由于这个项目是由一个没有任何外部库并且在未知操作系统上运行的自动反馈系统检查的(连我的导师都不知道,它是课程的系统),它必须是一个跨平台的解决方案不依赖于任何库,但 stdio.h、stdlib.h、string.h 和 windows.h

几乎每个教程和示例都使用 HANDLE(我们还没有学过,也不应该使用)或使用 . 问题是要找到一种没有直接库的方法。

我需要一些函数来获取目录中的所有文件

像这样的东西:

char** fileNames = somefunc(char* dir)
4

2 回答 2

2

仅使用标准库是无法做到这一点的;标准 C 不了解目录。但是,每个操作系统都有执行此操作的方法,因此您需要为您的检查器(Windows、Linux 等)找到操作系统系列,并查找如何为该操作系统执行此操作。

操作系统内置的库必须可用,因为它们是系统自带的。没有它们,您根本无法运行任何程序。(这在技术上是不正确的,但它足以涵盖所有有趣的案例。)

编辑:如果您的检查器在 Windows 下运行(从您的评论来看),您将需要使用FindFirstFileand FindNextFile。不过,它们确实依赖于句柄(就像几乎所有的 Windows API 一样),所以你必须研究一下。(句柄只是一个对 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;
}
于 2019-05-24T12:41:15.443 回答
1

dirent.h头是遍历目录的 POSIX 实现,这意味着它仅在类 UNIX 系统上运行。对于 Windows,您应该使用此处指定的_findfirst和函数。不像和这些不使用._findnextFindFirstFileFindNextFileHANDLE

例如:

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);
于 2019-05-24T12:52:25.237 回答