IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Заполнение массива именами файлов на Си в Unix (https://www.imho.ws/showthread.php?t=30223)

andryas 22.05.2003 14:13

Заполнение массива именами файлов на Си в Unix
 
Я недавно перешел на програмирование в Unix, и столкнулся с проблемой поиска файлов из программы на Си. В Dos существуют функции Findfirst и findnext, а здесь они отсутствуют.
Задача следующая: Необходимо заполнить массив именами файлов, учитывая маску имени файла, например "/usr/*.txt"
Большая просьба, укажите аналог перечисленых функций и/или проиллюстрируйте фрагментом кода. Заранее благодарен. Спасибо за внимание!

alexey_ma 22.05.2003 14:57

Смотри книгу Богатырева на http://lib.ru/CTOTOR/book.txt
Код:


А. Богатырев, 1992-95                  - 192 -                              Си в UNIX

    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>

    int listdir(char *dirname){
        register struct dirent *dirbuf;
        DIR *fddir;
        ino_t dot_ino = 0, dotdot_ino = 0;

        if((fddir = opendir (dirname)) == NULL){
            fprintf(stderr, "Can't read %s\n", dirname);
            return 1;
        }
        /* Без сортировки по алфавиту */
        while ((dirbuf = readdir (fddir)) != NULL ) {
            if (dirbuf->d_ino == 0) continue;
            if (strcmp (dirbuf->d_name, "." ) == 0){
                    dot_ino = dirbuf->d_ino;
                    continue;
            } else if(strcmp (dirbuf->d_name, "..") == 0){
                    dotdot_ino = dirbuf->d_ino;
                    continue;
            } else printf("%s\n", dirbuf->d_name);
        }
        closedir (fddir);

        if(dot_ino    == 0) printf("Поврежденный каталог: нет имени \".\"\n");
        if(dotdot_ino == 0) printf("Поврежденный каталог: нет имени \"..\"\n");
        if(dot_ino && dot_ino == dotdot_ino)  printf("Это корневой каталог диска\n");

        return 0;
    }

    int main(int ac, char *av[]){
        int i;

        if(ac > 1) for(i=1; i < ac; i++) listdir(av[i]);
        else                            listdir(".");

        return 0;
    }

И так далее.....

andryas 22.05.2003 15:08

Спасибо!
 
Большое спасибо! Работает. Задача миниум есть!
Но нет сортировки и не по маске. Может кто подскажет как сразу и по маске отбирать?

alexey_ma 22.05.2003 15:38

Посмотри книгу внимательно. Мне кажется что там где-то был пример поиска по маске.

alexey_ma 22.05.2003 15:52

До кучи:
массив сам потом можешь отсортировать как тебе нужно и еще при добавлении в массив можешь сделать проверку на то что имя файла соответствует маске.

andryas 22.05.2003 15:55

Спасибо всем! Я уже воплощаю :)

Ryback 23.05.2003 15:32

для сравнения по маске используй fnmatch

andryas 23.05.2003 16:14

Хорошо. Попробую. Спасибо!


Часовой пояс GMT +4, время: 14:54.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.