Решил поделиться рецептом для осуществления копирования большого количества файлов в связке Flex + MDM Zink под Mac OS.
Проблема с копированием большого количества файлов, используя MDM Zink API для работы с файловой системой, скажем, с CD на винт, и расфасовке их по папкам под Mac OS заключается в том, что MDM Zink Flex projector просто-напросто переставал копировать, не выдавая при этом никаких признаков того, что процесс копирования умер и ждать собственно нечего, плюс ко всем этим прелестям он копирует довольно долго даже сравнительно не большие файлы до 100 kb.
Служба поддержки у MDM Zink говорила в ответ на запрос, что, мол, таки да, но пока ничего поделать не будем.
Не помогало и разделение операций по формированию путей к файлам (откуда копируем и куда копируем), создавание структуры каталогов для копирования, реализация копирования файлов поштучно по таймеру или по событию от API. Удавалось лишь изредка увеличивать количество успешно скопированных файлов.
В результате всех этих неуспешных попыток настало время кардинальных методов; в начале пробовал реализовать копирование файлов посредством AppleScript (только для Mac OS), благо в API у MDM Zink заложена такая возможность. Но снова решение не совсем удалось, во-первых, из-за того, что AppleScript обладает не совсем привычным синтаксисом, и с первого раза не “раскуришь” все тонкости “языка яблок”, простенький пример, который считает количество файлов в папке “Applications”:
[code lang="applescript"]
tell application "Finder"
if folder "Applications" of startup disk exists then
return count files in folder "Applications" of startup disk
else
return 0
end if
end tell
[/code]
Да и не очень удобно было производить отладку, так как в начале приходилось писать код на Mac’e, в его чудном редакторе ScriptEditor, потом переносить в MDM Zink под Win, так как проект собирался на Flex + MDM Zink под Windows, где он не всегда компилировался. В итоге я не нашел консенсуса с “языком яблок” и принялся искать другое решение.
Финальная часть “марлезонского балета”: ситуация спасена благодаря тому, что MDM Zink API предусмотрел возможность работы с MacShell, он же bash. Посредством команд MacShell мы успешно копируем файлы.
[code lang="actionscript"]
// file это наш типизированный объект в котором идет нужая нам инфа
private function doCopy ( file:CopyTarget ) : void
{
// преобразовываем пути в макосъедобные, на случай если они у вас в win формате
var macFromPath : String = mdm.FileSystem.nativePathToUnixPath( file.copyFrom );
var macToPath : String = mdm.FileSystem.nativePathToUnixPath( file.copyTo );
// устраняем лишний слеш, если его нет, то устранять не нужно
macFromPath = macFromPath.slice( 0, macFromPath.length - 1 );
macToPath = macToPath.slice( 0, macToPath.length - 1 );
// оборачиваем все в кавычки "
macFromPath = '"' + macFromPath + '"';
macToPath = '"' + macToPath + '"';
// составляем shell команду
var shellScript : String = 'cp ' + macFromPath + ' ' + macToPath;
// запускаем, подчеркивания убрать поставил из-за того что WordPress отказывался сохранять пост
mdm_._Mac_Shell_._exec_( shellScript );
// тут вызов рекурсии по таймеру, чтобы дальше копировать и отображаем прогресс копирования
setTimeout( processCopyFiles, 600 );
}
[/code]
Итого, алгоритм действий, которые позволяют решить проблему с копированием большого количества файлов из MDM Zink под Mac OS:
- Подготавливаем заранее пути для создания каталога/ов и для копирования файлов (откуда и куда; путь, куда копировать, нужен еще для того, что иногда хочется файл переименовать). Времени много не отберёт, но разгрузит нагрузку под Mac OS и упростит создание дерева каталогов, во время подготовки путей для каталогов можно отсеять дубликаты.
- Создаём каталоги, это можно реализовывать через MDM Zink API, методом mdm.FileSystem.makeFolder();
- Копируем файлы поштучно, используя MacShell, с небольшой задержкой (я ставил 600 мс);
- Радуемся жизни.
Помимо всего, выигрышем в использовании MacShell является возможность радовать глаз пользователя такой замечательной вещью, как прогресс копирования файлов, чего никак нельзя сделать, если мы делаем какие-либо операции с файловой системой, используя MDM Zink API. Потому что он просто посылает Flex приложение в глубокий нокаут до завершения своих злодеяний, и на примере прогресса копирования счастливый пользователь увидит только состояние в 100%. Также мы легко можем сделать паузу/отмену копированию. В общем, сплошная радость.
Бонусный рецепт для тех, кто дочитал до конца . Рецепт, как закрыть ваше MDM Zink приложение, работающее под Mac OS, да еще и в fullscreen режиме. При попытке закрыть приложение путем MDM Zink API (mdm.Application.exit()), приложение бывает просто уходит в ступор и жалобно просит “force quit”, то есть “снять задачу”.
MDM Zink сапорт, когда-нибудь напишу про него отдельную статью, лаконично ответил: “А вы не юзайте fullscreen”.
Но выход есть, немного грубо, но работает, просто запускаем, через mdm.MacShell.exec(), чудную команду – “killall mdm-static”.
Fin.
На первый раз я думаю рецептов хватит, но если у кого есть альтернативные решения данных проблем, милости просим.
ps. сорри за битый пост, была проблема с wordpress и code snippet плагином, чтото не дает сохранить пост с кодом