Иногда вам может понадобится скопировать папку во время выполнения вашей GameMaker игры. И, казалось бы, это должно быть просто... но не настолько просто. file_copy может лишь копировать файлы, а функции для работы с папками могут создавать, проверять на существование, и искать файлы в папках. Но, имея упомянутые функции для папок, можно довольно легко реализовать функцию копирования папки.
Используемая тут идея заключается в том, что список файлов в исходной папке заносится в массив, после чего проходом по файлам определяется, нужно ли их копировать как файлы (через file_copy) или папки (через рекурсивный вызов скрипта). Конечно, рекурсивные вызовы представляют определенный риск, если вы бы, к примеру, решили скопировать содержимое одного локального диска на другой, но вы же не собираетесь делать такие вещи посредством GameMaker... правда?
Приложенный пример содержит в себе функцию и простую демонстрацию работы (вводить пути двух папок нужно вручную).
Исходный код ниже,
/// 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 } }
___________________________________________
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 стоит.