簡體   English   中英

如何在C中不使用“ dirent.h”(Visual Studio 2017 Windows)的情況下查找特定目錄中的所有文件名

[英]How to find all the file names in a specific directory without using “dirent.h” (visual studio 2017 windows) in C

我有一個學期中期的項目,要制作一個防病毒軟件,它的主要參數是目錄和路徑:路徑是指向包含病毒簽名的文件。 防病毒軟件的目標是掃描給定目錄中的所有文件以獲取病毒簽名。 我已經完成了整個項目,除了可以在特定給定目錄中查找所有文件的部分。 由於該項目是由沒有任何外部庫並且在未知操作系統運行的自動反饋系統檢查的(即使我的講師也不知道,它是課程的系統),因此它必須是跨平台的解決方案除了stdio.h,stdlib.h,string.h和windows.h,它不依賴任何庫

幾乎每個教程和示例都使用HANDLE(我們尚未學習,並且不應該使用)或。 問題是找到一種無需Dirent庫的方法。

我需要一些功能來獲取目錄中的所有文件

像這樣:

char** fileNames = somefunc(char* dir)

僅憑標准庫是無法做到這一點的。 標准C不了解目錄。 但是,每個操作系統都有執行此操作的方法,因此,您需要查找檢查程序的操作系統系列(Windows,Linux等),並查找如何針對該操作系統執行此操作。

操作系統內置的庫必須可用,因為它們是系統附帶的。 沒有它們,您將無法運行任何程序 (從技術上講,這是不正確的,但它足以涵蓋所有有趣的情況。)

編輯:如果您的檢查器在Windows下運行(從您的評論來看),則需要使用FindFirstFileFindNextFile 但是,它們確實依賴於句柄(就像幾乎所有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;
}

dirent.h標頭是遍歷目錄的POSIX實現,這意味着它僅在類似UNIX的系統上運行。 對於Windows,應使用此處指定的_findfirst_findnext函數。 FindFirstFileFindNextFile不同,它們不使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM