2016-05-15 1 views
-2

Мне нужно найти способ сканирования папки (например, -C: \ Users \ User \ Documents \ HW) и проверить, есть ли какой-либо текст, который Я получаю от пользователя. Мне нужно вернуть, какие файлы имеют тот же самый текст. Раньше я никогда не использовал dirent.h, и я понятия не имею, как мне работать с ним;как сканировать текст в папке с использованием заголовка dirent в C

+1

Идея состоит в том, чтобы использовать 'opendir' в пути к каталогу, а затем цикл с' readdir' для поиска всех файлов и для каждого файла, который, вероятно, также должен будет «открываться», «читать» и «закрывать». Вы также можете использовать для каждого файла 'fopen',' fread' и 'fclose'. После этого вы также должны вызвать 'closedir'. –

+0

Пожалуйста, просто сделайте некоторое исследование самостоятельно, прежде чем просить мир о помощи. Спасибо. – alk

+0

спасибо Хенрик! и угадайте, что, алк, я пробовал. и потерпел неудачу. так что случилось с «просить мир помочь»? это веб-сайт для вопросов и ответов! –

ответ

0

Вы определяете собственную error функции, которая обрабатывает ошибку:

// Standard error function 
void fatal_error(const char* message) { 

    perror(message); 
    exit(1); 
} 

функция Traverse в основном стат текущего файла, если этот файл каталог, мы войдем в этот каталог. В самом каталоге очень важно проверить, существует ли текущий каталог. или .. потому что это может привести к бесконечной петле.

void traverse(const char *pathName){ 

    /* Fetching file info */ 
    struct stat buffer; 
    if(stat(pathName, &buffer) == -1) 
    fatalError("Stat error\n"); 

    /* Check if current file is regular, if it is regular, this is where you 
    will see if your files are identical. Figure out way to do this! I'm 
    leaving this part for you. 
    */ 

    /* However, If it is directory */ 
    if((buffer.st_mode & S_IFMT) == S_IFDIR){ 

    /* We are opening directory */ 
    DIR *directory = opendir(pathName); 
    if(directory == NULL) 
     fatalError("Opening directory error\n"); 

    /* Reading every entry from directory */ 
    struct dirent *entry; 
    char *newPath = NULL; 
    while((entry = readdir(directory)) != NULL){ 

     /* If file name is not . or .. */ 
     if(strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){ 

     /* Reallocating space for new path */ 
     char *tmp = realloc(newPath, strlen(pathName) + strlen(entry->d_name) + 2); 
     if(tmp == NULL) 
      fatalError("Realloc error\n"); 
     newPath = tmp; 

     /* Creating new path as: old_path/file_name */ 
     strcpy(newPath, pathName); 
     strcat(newPath, "/"); 
     strcat(newPath, entry->d_name); 

     /* Recursive function call */ 
     traverse(newPath); 
     } 
    } 
    /* Since we always reallocate space, this is one memory location, so we free that memory*/ 
    free(newPath); 

    if(closedir(directory) == -1) 
     fatalError("Closing directory error\n"); 
    } 

} 

Вы также можете сделать это с помощью функции chdir(), это может быть проще, что путь, но я хотел бы показать вам этот путь, так как это очень ilustrating. Но самый простой способ преодолеть иерархию папок/файлов - NFTW. Убедитесь, что вы проверяете это на страницах man.

Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.

+0

Спасибо, что так много Aleksandar !!! –

 Смежные вопросы

  • Нет связанных вопросов^_^