Как найти файл в каталоге на c

#c #file #directory

#c #файл #каталог

Вопрос:

Я пытаюсь создать функцию на c, которая сканирует данный каталог на наличие файлов заданного формата (например: — _sort.txt ) и проверьте, содержит ли каталог файл этого формата или нет.

если каталог содержит файл этого формата, то он должен возвращать -1, иначе 0. но я застрял на том, как сканировать каталог. кто-нибудь может мне помочь с этим.

я довольно новичок в c, поэтому, пожалуйста, потерпите меня.

операционная система: — Linux

Комментарии:

1. В какой операционной системе?

2. Linux @DavidRanieri Сэр

3. В этом случае dirent это то, что вы ищете: pubs.opengroup.org/onlinepubs/007908799/xsh/dirent.h.html

4. У вас есть короткий пример здесь: pubs.opengroup.org/onlinepubs/007908799/xsh/readdir.html

Ответ №1:

вы можете использовать strstr для поиска шаблона в имени файла.

не забудьте включить эти заголовки:
#включить <dirent.h>
#включить <string.h>

 int find_file(const char *pattern, DIR *dr) {                                                                                                                                          
                                                                                                                                                                                       
    struct dirent *de;                                                                                                                                                                 
                                                                                                                                                                                       
    int found = -1;                                                                                                                                                                    
                                                                                                                                                                                       
    while ( (de = readdir(dr)) != NULL) {                                                                                                                                              
                     
        // DT_REG is a regular file                                                                                                                                                          
        if (de->d_type == DT_REG amp;amp; strstr(de->d_name, pattern) != NULL) {                                                                                                             
                                                                                                                                                                                       
            found = 0;                                                                                                                                                                 
            break;                                                                                                                                                                     
        }                                                                                                                                                                              
    }                                                                                                                                                                                  
    return found;                                                                                                                                                                      
}        
  

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

 int main() {                                                                                                                                                                           
                                                                                                                                                                                       
                                                                                                                                                                                       
    DIR *d = opendir(".");                                                                                                                                                             
    const char *pattern = "_sort.txt";                                                                                                                                                 
                                                                                                                                                                                       
    if (find_file(pattern, d) == 0)                                                                                                                                                    
        printf("found itn");                                                                                                                                                          
    else                                                                                                                                                                               
        printf("not found itn");                                                                                                                                                      
                                                                                                                                                                                       
                                                                                                                                                                                       
    return 0;                                                                                                                                                                          
}    

  

для получения дополнительной информации о dirent struct:
man readdir