Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 3
    Гостей: 3
    Пользователи: - отсутствуют
    Роботы: - отсутствуют

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 22-12-2011, 02:52 Просмотров: 3069

    Функции open_dir,next_file и close_dir. Чтение директорий.

    В описании функции read_dir, было сказано что лучше использовать другую функцию, другой функцией является трио из функций:
    Инфо из file.inc:
    //Returns a handle to a directory
    native open_dir(dir[], firstfile[], length);
    native next_file(dirh, buffer[], length);
    native close_dir(dirh);


    Синтаксис:
    open_dir ( dir[], buffer[], length )

    • dir[] - Открываемая директория
    • buffer[] - Массив для записи имен фалов
    • length - Максимальная длина имени
    Функция создает дескриптор директории и получает имена файлов

    Синтаксис:
    next_file ( dirh, buffer[], length )

    • dirh - Дескриптор директории
    • buffer[] - Массив с именами файлов
    • length - максимальная длина.
    Функция обращается к следующей строке директории, если е нет, вернет 0.

    Синтаксис:
    close_dir ( dirh )

    • dirh - Дескриптор директории - закрывает дескриптор.


    Тип функции:
    Native

    Пример:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "[file.inc] open_dir,next_file,close_dir"
    #define VERSION "1.0"
    #define AUTHOR "Admin"


    public plugin_init()
    {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        new dir, mapName[32]
        dir = open_dir("maps", mapName, sizeof(mapName)-1)
        
        if (dir)
        {
            new lenMapName
            
            while (next_file(dir, mapName, sizeof(mapName)-1))
            {
                lenMapName = strlen(mapName)
                if (lenMapName > 4 && equali(mapName[lenMapName - 4], ".bsp", 4))
                {
                    mapName[lenMapName-4] = '^0'
                    if (is_map_valid(mapName))
                    {
                        server_print("%s",mapName)
                    }
                }
            }
            close_dir(dir)
        }    
    }


    Описание:
    Очень простой и наглядный пример, который выведет в консоль все карты в папке с картами сервера.
    Функции open_dir,next_file и close_dir. Чтение директорий.
    Что бы понять как работает данный код, вы обязаны знать принцип работы цикла while.

    В двух словах же все просто:
    Сначала получаем дескриптор директории и файлы из нее с помощью функции open_dir.
    Затем в цикле функция next_file читает следующий фал из дескриптора (вернее из массива соответствующего дескриптору)
    И если он есть то несколько нехитрых проверок, что бы отсеять не файлы карт и вывод в консоль сервера названий карт.
    И в завершении обязательно закрытие дескриптора функцией close_dir.

    Вот такой вот не сложный способ прочесть все имена файлов в какой либо директории сервера.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Функции open_dir,next_file и close_dir. Чтение директорий.
    shabazz 2281zxcod

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    [/code]

    public fwFile(){
    new array[64]
    new FID = open_dir("/addons/amxmodx/configs/", array, charsmax(array))
    while(next_file(FID, array, charsmax(array))) {
    //выводим все файлы в папке configs
    server_print("%s", array)
    }
    close_dir(FID)
    }

    [code=pawn]
    daneel

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Пример содержит небольшую ошибку. open_dir, как многие догадались, возвращает в параметрах первый файл в директории. Однако не факт, что это будет "." или ".." Поэтому выход open_dir тоже необходимо учитывать

    new file[128]
    if ( dir = open_dir(path, file, 127) ) {
    file_add(file)
    while ( next_file(dir, file, 127))
    file_add(file)
    }

    Сам бы не догадался, пока не вывел полный список файлов.

    PS:
    if (lenMapName > 4 && equali(mapName[lenMapName - 4], ".bsp", 4))

    Не стоит забывать, что файл может иметь двойные расширения. Так например если производить поиск музыки, то в папке будут находиться файлы вида file.mp3.ztmp Но это замечание уже не автору, а тем, кто собирается копипастить.
    Valer4

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Насчёт первого прав.
    Насчёт второго тут кол-во карт считается, а не файлов.

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама