GameMaker: Рекурсивное копирование папок

Иногда вам может понадобится скопировать папку во время выполнения вашей GameMaker игры. И, казалось бы, это должно быть просто... но не настолько просто. file_copy может лишь копировать файлы, а функции для работы с папками могут создавать, проверять на существование, и искать файлы в папках. Но, имея упомянутые функции для папок, можно довольно легко реализовать функцию копирования папки.
Используемая тут идея заключается в том, что список файлов в исходной папке заносится в массив, после чего проходом по файлам определяется, нужно ли их копировать как файлы (через file_copy) или папки (через рекурсивный вызов скрипта). Конечно, рекурсивные вызовы представляют определенный риск, если вы бы, к примеру, решили скопировать содержимое одного локального диска на другой, но вы же не собираетесь делать такие вещи посредством GameMaker... правда?

Приложенный пример содержит в себе функцию и простую демонстрацию работы (вводить пути двух папок нужно вручную).

Скачать GMK

Исходный код ниже,

/// file_copy_dir(source, target, attributes)
// Copies contents from source directory to target directory.
// Add fa_directory to attributes for recursive copying.
var fname, i, file, files, from, to;
// create directory if it doesn't exist yet:
if (!directory_exists(argument1)) directory_create(argument1)
// push matching files into array:
// (has to be done separately due to possible recursion)
files = 0
for (fname = file_find_first(argument0 + "/*.*", argument2); fname != ""; fname = file_find_next()) {
    // don't include current/parent directory "matches":
    if (fname == ".") continue
    if (fname == "..") continue
    // push file into array
    file[files] = fname
    files += 1
}
file_find_close()
// process found files:
i = 0
repeat (files) {
    fname = file[i]
    i += 1
    from = argument0 + "/" + fname
    to = argument1 + "/" + fname
    if (file_attributes(from, fa_directory)) {
        file_copy_dir(from, to, argument2) // recursively copy directories
    } else {
        file_copy(from, to) // copy files as normal
    }
}

Похожие записи

GameMaker: Рекурсивное копирование папок: 3 комментария

  1. ___________________________________________
    ERROR in
    action number 1
    of Create Event
    for object o_test:

    In script file_copy_dir:
    Error in code at line 12:
    if (s == “.”) continue
    ^
    at position 10: Unknown variable s

    • Поправил. Должно было быть “fname” вместо “s”. Неудачное форматирование кода для читаемости.

      • Код со страницы теперь рабочий.
        Однако, в gmk та же ошибка до сих пор – s вместо fname стоит.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *