AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.08.2015, 11:33   #1  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Cool Запаковка в ZIP архив
Было задание запаковать файл прямо в аксапте. На основе интернета написал такую функцию. Может кому пригодится.


X++:
boolean zip(str sSourceFile, str sTargetZIPFile)
{
    str fzip;
    FileName tmpFileName;
    FileName tmpZipFileName;

    boolean retVal;

    AsciiIO file;
    int ret;

    ;
    if (!(sSourceFile && sTargetZIPFile))
        return retVal;


    //Windows vbScript
    fzip += '\n'+'Dim oShellApp, oFSO, sSourceFile, sTargetZIPFile, oZipFile, objFolder';
    fzip += '\n'+'Set oShellApp = CreateObject(\"Shell.Application\")';
    fzip += '\n'+'Set oFSO = CreateObject(\"Scripting.FileSystemObject\")';
    fzip += '\n'+'sSourceFile = Wscript.Arguments.Item(0)';
    fzip += '\n'+'sTargetZIPFile = Wscript.Arguments.Item(1)';
    fzip += '\n'+'\'Write the fileheader for a blank zipfile.';
    fzip += '\n'+'Set oZipFile = oFSO.OpenTextFile(sTargetZIPFile, 2, True)';
    fzip += '\n'+'oZipFile.Write \"PK\" & Chr(5) & Chr(6) & String(18, Chr(0))';
    fzip += '\n'+'oZipFile.Close';
    fzip += '\n'+'\'Start copying file into the zip from the source folder.';
    fzip += '\n'+'Set objFolder = oShellApp.NameSpace(sTargetZIPFile)';
    fzip += '\n'+'if not objFolder is nothing then ';
    fzip += '\n'+'    objFolder.CopyHere sSourceFile';
    fzip += '\n'+'    \'Because the copying occurs in a separate process, the script will just continue.  Run a DO...LOOP to prevent the function';
    fzip += '\n'+'    \'from exiting until the file is finished zipping.';
    fzip += '\n'+'     Do';
    fzip += '\n'+'        WScript.Sleep 1000';
    fzip += '\n'+'     Loop While objFolder.Items.Count < 1';
    fzip += '\n'+'End If';


    tmpFileName = Winapi::getTempFilename(WinApi::getTempPath(),'_zip');
    tmpFileName = strreplace(tmpFileName,'.tmp','.vbs');

    tmpZipFileName = Winapi::getTempFilename(WinApi::getTempPath(),'_tz');
    tmpZipFileName = strreplace(tmpZipFileName,'.tmp','.zip');

//    info(strfmt('temp script file: %1',tmpFileName));
//    info(strfmt('temp zip file: %1',tmpZipFileName));

    if (WinApi::fileExists(tmpFileName))
        WinApi::deleteFile(tmpFileName);

    if (WinApi::fileExists(tmpZipFileName))
        WinApi::deleteFile(tmpZipFileName);


    //BP Deviation documented
    file = new AsciiIO(tmpFileName,'w');
    file.outRecordDelimiter('\n');
    if (file)
    {
        file.write(fzip);
        file = null;

        ret = Winapi::shellExecute('wscript.exe',strfmt('\"%1\" \"%2\" \"%3\"',tmpFileName,
                        sSourceFile,
                        tmpZipFileName),'','',0,true);

        //Sleep(1000);
        if (ret && Winapi::fileExists(tmpZipFileName))
        {

            if (WinApi::fileExists(sTargetZIPFile))
                WinApi::deleteFile(sTargetZIPFile);

            ret = WinApi::moveFile(tmpZipFileName,sTargetZIPFile);
            if (!ret)
                retVal = true;

        }
    }

    return retVal;
}
За это сообщение автора поблагодарили: macklakov (5), Ace of Database (3),  (1).
Старый 28.08.2015, 11:43   #2  
axm2013
Гость
 
n/a
Еще можно было бы что то типа
X++:
System.IO.Compression.ZipFile::CreateFromDirectory("C:\\Test", "C:\\TestZip.zip");
Старый 28.08.2015, 11:57   #3  
rkorchagin is offline
rkorchagin
Участник
 
81 / 69 (3) ++++
Регистрация: 26.09.2006
Функция писалась для третьей аксапты, где нет .net
Даже последний параметр в shellExecute пришлось дописывать отдельно (частично скопировал с 4ой версии).
Теги
shellexecute, vbs, zip, архив, запаковка, паковать

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Разархивирование zip архива встроенным в windows архиватором vad21 DAX: Программирование 17 08.04.2016 08:59
palleagermark: How to make a ZIP file from AX 2012 R2 CU7 Blog bot DAX Blogs 0 07.04.2014 11:11
Zip-архивирование средствами Windows 2008 Damn DAX: Программирование 16 26.11.2013 19:58
palleagermark: Create ZIP files from AX Blog bot DAX Blogs 0 28.11.2011 17:11
Как разархивировать zip архив? slava09 DAX: База знаний и проекты 33 25.02.2011 14:48

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:50.