Создание ZIP-архивов из JavaScript

  • Автор темы Автор темы Tiburtsy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Tiburtsy

Топикстартер
15 лет на форуме
Сообщения
60
Реакции
14
Пытался разобраться с темой, провозился с библиотекой JSZIP целый день, так ничего путнего и не вышло. Может у кого есть какие наработки в этой теме? В интернете тоже не густо по этой теме и везде идет отсылка к вышеупомянутой библиотеке.
Завтра на работе попробую на Маке такую команду
Код:
var test = app.doScript('do shell script "zip ~/Desktop/Zip/test.zip file1.txt file2.txt" ', ScriptLanguage.applescriptLanguage);
 
Ответ: Создание ZIP-архивов из JavaScript

Лично я б, не мудрствуя лукаво, запускал бы архиватор через File.Execute, типа, как здесь.
 
Ответ: Создание ZIP-архивов из JavaScript

Лично я б, не мудрствуя лукаво, запускал бы архиватор через File.Execute, типа, как здесь.

архиватор можно и руками запустить :cry: толку-то? ему вроде как надо еще параметры передать, а это через File.execute() не сделать. так что да, через AS нормальный вариант. на винде можно генерить .bat, и его уже запускать
 
Ответ: Создание ZIP-архивов из JavaScript

архиватор можно и руками запустить толку-то?
А в чем проблема-то? Насколько я понимаю, надо что-то из скрипта заархивировать? Сформировать командную строку для архиватора и запустить через Execute - что не так?
 
Ответ: Создание ZIP-архивов из JavaScript

Сформировать командную строку для архиватора и запустить через Execute - что не так?

ну ее в файл надо записать сначала, потом уже запустить. и еще чтоб у файла были права на запуск при этом. на маке проще через AS.
 
Ответ: Создание ZIP-архивов из JavaScript

А! Только сейчас до меня дошло, что имеется в виду мак.
 
Ответ: Создание ZIP-архивов из JavaScript

Да, скрипт планируется использовать на работе под Мак, но писать и отлаживать приходиться большей частью дома, под Вин. Хотелось бы, конечно, кроссплатформенный скрипт, но если получиться через AS, будет круто (через систему самое надежное выполнение архивации). Правда отлаживать скрипт будет совсем плохо, на работе нет времени, а дома Вин.
Кстати, мне в идеале не файлы, а папку нужно зиповать, с подкаталогами и всем содержимым в них, надеюсь, через один параметр главной папки удастся передать.
 
Ответ: Создание ZIP-архивов из JavaScript

параметры передать, а это через File.execute() не сделать
Отчего же не сделать? Мне кажется, не проблема сформировать строку запуска архиватора с параметрами и передать в execute(). Только не хочу сторонними программами пользоваться, громоздко это, не удобно и не надежно. Два разных компа, разные версии ОС, да еще и Мас, не хочу даже думать в этом направлении.
 
Ответ: Создание ZIP-архивов из JavaScript

Только не хочу сторонними программами пользоваться, громоздко это, не удобно и не надежно.

Вообще-то есть еще штатный метод app.packageUCF. К сожалению в нем присутствует изрядная ложка дегтя: функция неверно обрабатывает файлы в байтами заполненными нулями. Но текстовые файлы жмутся отлично.

На vbscript тоже можно делать zip-архивы не используя дополнительный софт, хотя и немного сложнее чем на мас: http://groups.google.com/d/msg/microsoft.public.scripting.vbscript/46vFiUOqFvE/5LGLkNWpQS4J
 
Ответ: Создание ZIP-архивов из JavaScript

На vbscript тоже можно делать zip-архивы не используя дополнительный софт, хотя и немного сложнее чем на мас:
Гм, а вы уверены, что эта конструкция будет работать без установленного винзипа? Я так понимаю, что там все завязано на ассоциации с расширением ZIP и как это работать будет без установленного в системе архиватора - большой вопрос.
 
Ответ: Создание ZIP-архивов из JavaScript

Отчего же не сделать? Мне кажется, не проблема сформировать строку запуска архиватора с параметрами и передать в execute().

execute - метод файла, а не строки. и имейте в виду, что файл запустится, а скрипт пойдет выполняться дальше. информацию об успешном/неуспешном выполнении никто не вернет

ну и как я говорил, на маке .sh будет создан без прав запуска, назначать их надо будет руками каждый раз
 
Ответ: Создание ZIP-архивов из JavaScript

маковская командная строка, жмущая каждую папку в текущем каталоге в отдельный архив

Код:
find . -type d -maxdepth 1 -exec zip -r \{}.zip \{} \;

можно попробовать её присобачить
 
Ответ: Создание ZIP-архивов из JavaScript

Гм, а вы уверены, что эта конструкция будет работать без установленного винзипа?

Вызывается штатная библиотека для работы с zip-архивами. Она доступна начиная с милениума.
 
Ответ: Создание ZIP-архивов из JavaScript

про JSZip нашел вот что
http://www.indiscripts.com/post/2011/12/indesign-scripting-forum-roundup-2
Код:
The JavaScript JsZip library is not very fast when wrapped in ExtendScript, but it works provided a slight fix to the JSZip.prototype.addExistingFile method.

Suggested code:

#include 'jszip/jszip.js'
 
JSZip.prototype.addExistingFile = function(/*File*/f, newName)
//--------------------------------------
{
var contents = false;
 
if( f.constructor == File && f.exists && (f.encoding = 'BINARY') && f.open('r') )
    {
    contents = f.read();
    f.close();
    return this.add(
        newName||f.name,
        contents,
        {binary: true, date: f.modified}
        );
    }
throw new Error("Unable to open the file "+f);
}

http://forums.adobe.com/message/3750810#3750810
 
Тема закрыта, а зря.
Потому что текущая версия JSZip тупо валится на первой же строке. Что печаль.
 
Тема закрыта, а зря.
Потому что текущая версия JSZip тупо валится на первой же строке. Что печаль.

Попробовал, вроде работает.

Библиотека JSZip во вложении

Пример использования:
Код:
#include 'jszip.js'

JSZip.prototype.addExistingFile = function(/*File*/f, newName)
//--------------------------------------
{
var contents = false;
if( f.constructor == File && f.exists && (f.encoding = 'BINARY') && f.open('r') )
    {
    contents = f.read();
    f.close();
    return this.add(
        newName||f.name,
        contents,
        {binary: true, date: f.modified}
        );
    }
throw new Error("Unable to open the file "+f);
}
// Sample Client Code
// ---

var folder = new Folder('путь к тестовой папке');
var zip = new JSZip();
zip.add("Hello.txt", "Hello World\n");
zip.folder("images").
     addExistingFile(File(folder+"/test.jpg")); //тестовый файл для добавления
var content = zip.generate(true); // asBytes
var f = File(folder+'/test.zip');
f.encoding = 'BINARY';
if( f.open('w') )
     {
     f.write(content);
     f.close();
     }


Теперь возник вопрос: как распаковать? ))
 

Вложения

Последнее редактирование модератором:
Теперь возник вопрос: как распаковать? ))
а распаковать можно вообще в одну строчку стандартной командой InDesign:
Код:
app.unpackageUCF(archiveName, folderWithArchive);

теперь вопрос - можно ли таким же методом делать архивы прямо с индизайна через app.packageUCF(...) - у меня что-то не получается(( гугление показывает что там должно быть 3 параметра - папка которую надо архивировать, название конечного файла (название архива), и формат (myme-type, по умолчанию оно application/vnd.adobe.indesign-idml-package)

в идеале хотелось бы собрать скрипт, который будет делать Package, экспортировать несколько PDF (например для печати и для веб), ZIP`овать, отправлять в Dropbox (или другие облачка), а ссылку на архив отправлять заказчику на почту, мол "получите-распишитесь" - и все это делать в один клик - я знаю что миссия выполнима, вопрос только в том сколько времени потребуется на реализацию и нужно ли оно кому-то кроме меня / есть желающие помочь?
 
На AppleScript в Mac OS zip-ует:
package UCF source folder theFolder UCF file (theFolder2 & "arc.zip")
Но, штатный распаковщик Mac OS этот zip не раскручивает!
Индизайновский распаковывает без проблем.
Зато беда с русскими именами :( И беда от индизайна - сторонний Unpacker раскручивает с нормальными именами.
 
Статус
Закрыто для дальнейших ответов.