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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2011, 17:42   #1  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Zip-архивирование средствами Windows 2008
Тут была статья daxdilip: Dynamics AX 2009 Integration with PowerShell to unzip files как разархивировать zip-файл с помощью стандартных средств операционной системы.
А вот как сделать обратное ? Создать zip-архив. Совсем не хочется использовать сторонние программы для архивирования.
__________________
Дмитрий
Старый 07.02.2011, 18:03   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Посмотрите тут: http://blogs.msdn.com/b/daiken/archi...ar-gadget.aspx
Создание архива
PHP код:
function New-Zip
{    
        
param([string]$zipfilename)    
        
set-content $zipfilename ("PK" + [char]+ [char]+ ("$([char]0)" 18))    
        (
dir $zipfilename).IsReadOnly $false
}
 
usage: new-zip c:\demo\myzip.zip 
и распаковка:

PHP код:
function Extract-Zip
{    
param([string]$zipfilename, [string$destination)    
     if(
test-path($zipfilename))    
     {            
         
$shellApplication = new-object -com shell.application        
         $zipPackage 
$shellApplication.NameSpace($zipfilename)        
         
$destinationFolder $shellApplication.NameSpace($destination)        
         
$destinationFolder.CopyHere($zipPackage.Items())    
      }
}
 
usageextract-zip c:\demo\myzip.zip c:\demo\destination 
До кучи - добавление в архив:
PHP код:
function Add-Zip
{
    
param([string]$zipfilename)
    if(-
not (test-path($zipfilename)))
    {
        
set-content $zipfilename ("PK" + [char]+ [char]+ ("$([char]0)" 18))
        (
dir $zipfilename).IsReadOnly $false
    
}
    
$shellApplication = new-object -com shell.application
    $zipPackage 
$shellApplication.NameSpace($zipfilename)
    foreach(
$file in $input)
    {
             
$zipPackage.CopyHere($file.FullName)
             
Start-sleep -milliseconds 500
    
}
}
 
usagedir c:\demo\files\*.* -Recurse add-Zip c:\demo\myzip.zip 
И получение списка файлов:

PHP код:
function Get-Zip
{
    
param([string]$zipfilename)
    if(
test-path($zipfilename))
    {
        
$shellApplication = new-object -com shell.application
        $zipPackage 
$shellApplication.NameSpace($zipfilename)
        
$zipPackage.Items() | Select Path
    
}
}
 
usageGet-Zip c:\demo\myzip.zip 
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 07.02.2011 в 18:11.
Старый 07.02.2011, 18:26   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Кстати, хочу отметить, что в Windows еще до 2008 был архиватор %SystemRoot%\System32\Iexpress.exe.
Вот его описание: http://clubrus.kulichki.com/iexindex.htm
И его параметры командной строки:
Название: Снимок.PNG
Просмотров: 2954

Размер: 7.3 Кб
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Damn (2).
Старый 08.02.2011, 13:42   #4  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Первый способ архивирования понять не смог

А вот с %SystemRoot%\System32\Iexpress.exe разобрался. Создаёт cab-архивы. Проверял на Windows XP, 2003 и 2008. Работает одинаково. Но есть недостатки.

Имя результирующего файла архива можно указывать только в формате 8.3. То есть надо где-то брать временное 8-символьное имя для файла, а после создания архива его переименовывать.
Путь к файлу SED в параметрах командной строки нужно указывать в так называемом укороченном виде (с символами ~). То есть либо изначально пытаться сохранять этот файл в месте с уже "коротким" путём, либо каждый раз преобразовывать путь к файлу к короткому виду. На стороне клиента можно использовать метод WinAPI::getShortPathName(), а вот на стороне сервера даже не знаю что использовать.

Разобраться бы с первым способом, может у него нет таких недостатков.
__________________
Дмитрий
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 08.02.2011, 13:57   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Damn Посмотреть сообщение
Первый способ архивирования понять не смог
...
Разобраться бы с первым способом, может у него нет таких недостатков.
Суть в следующем (я честно говоря не силен в языке Powershell). В приведенной Вами ссылке как распаковать файл - создается некий скрипт (файл *.ps1) на языке Powershell, который впоследствии запускается из АХ. Т.е. распаковкой занимается Powershell.
В приведенных мною примерах - производится упаковка / распаковка и прочие действия на языке Powershell (т.е. есть пример кода, которые могут заставить Powershell заняться архивированием).
Этот код нужно оформить в файл *.ps1 и вызвать Powershell точно также (но с другим файлом *.ps1) как указано в примере по приведенной Вами ссылке. И все.

Конечно я привел не совсем готовый пример. Но в любом случае - при более детальном изучении языка Powershell (коим я не владею) - думаю - что Вы сможете достичь своей цели.
__________________
Возможно сделать все. Вопрос времени
Старый 08.02.2011, 14:05   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Damn Посмотреть сообщение
На стороне клиента можно использовать метод WinAPI::getShortPathName(), а вот на стороне сервера даже не знаю что использовать.
А на стороне сервера нельзя эту же функцию использовать? (понимаю, что ее нет в классе WinAPIServer, но ее ж можно и создать)
__________________
Возможно сделать все. Вопрос времени
Старый 08.02.2011, 16:41   #7  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А на стороне сервера нельзя эту же функцию использовать? (понимаю, что ее нет в классе WinAPIServer, но ее ж можно и создать)
Когда функция вызывается на стороне сервера (Windows 2008 Server x64), то выдаётся ошибка "Функция "GetShortPathNameW" в библиотеке DLL "KERNEL32" привела к возникновению исключения."
Погуглил в интернете по слову GetShortPathName и нашёл что не только у меня такая ошибка возникает, решения пока не нашёл.
__________________
Дмитрий
Старый 08.02.2011, 16:49   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а никто не пробовал через .Net с архивами работать?
Старый 08.02.2011, 16:57   #9  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Мы для этих целей использовали 7zip. Создали таблицу параметров, где указаны команды для командной строки и просто запускали процесс (new System.Diagnostics.ProcessStartInfo(...).Start() ), передавая ему параметры командной строкой

Теоретически можно использовать .NET (CLR Interoperability) для этих целей. Класс GZipStream

тут пример можно посмотреть.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
За это сообщение автора поблагодарили: Wamr (1).
Старый 09.02.2011, 01:11   #10  
offenmeier is offline
offenmeier
HAI; CAN HAS STDIO?
Аватар для offenmeier
Соотечественники
 
77 / 36 (2) +++
Регистрация: 17.02.2005
Адрес: Auckland, NZ
Как разархивировать zip архив?

нет никаких проблем с использованием внешнего архиватора, смотри мой пост (один из последних).

а методы из WinAPI в WinAPIServer можно аккуратно переписывать самому (микрософт поленился).
__________________
our sharp bitter vitriol is not that of the vulgar.
Старый 09.02.2011, 08:42   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Damn Посмотреть сообщение
Когда функция вызывается на стороне сервера (Windows 2008 Server x64), то выдаётся ошибка "Функция "GetShortPathNameW" в библиотеке DLL "KERNEL32" привела к возникновению исключения."
Цитата:
Сообщение от offenmeier Посмотреть сообщение
а методы из WinAPI в WinAPIServer можно аккуратно переписывать самому (микрософт поленился).
Microsoft не поленился - просто в 2009-й (если речь о ней) появился 64-битный AOS, который в общем случае куда интереснее 32-битного, но в нем не реализован класс DLLFunction, поскольку в общем случае загружаемая DLL может быть 32-битной, а 64-битный процесс не может загружать 32-битные DLL в свое адресное пространство. Именно поэтому WinAPIServer написан с использованием исключительно .NET Framework.
За это сообщение автора поблагодарили: Damn (2), plumbum (1).
Старый 10.02.2011, 02:02   #12  
offenmeier is offline
offenmeier
HAI; CAN HAS STDIO?
Аватар для offenmeier
Соотечественники
 
77 / 36 (2) +++
Регистрация: 17.02.2005
Адрес: Auckland, NZ
я же и говорю, поленился. а как вы думаете, как я переписывал методы в WinAPIServer, не через .NET Framework? потому и говорю, что "аккуратно"
__________________
our sharp bitter vitriol is not that of the vulgar.
Старый 10.02.2011, 09:19   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Расскажите, пожалуйста, как вы переписали на .NET Framework реализацию kernel32.GetShortPathName без использования P/Invoke?
Старый 11.02.2011, 00:44   #14  
offenmeier is offline
offenmeier
HAI; CAN HAS STDIO?
Аватар для offenmeier
Соотечественники
 
77 / 36 (2) +++
Регистрация: 17.02.2005
Адрес: Auckland, NZ
переписывал только те, что нужны были: shellExecute() и waitForSingleObject() потому что он используется в shellExecute(), но в конечном счёте реализовал ShellExecute() через System.Diagnostics.Process:

X++:
System.Diagnostics.Process testProcess;
;

new InteropPermission(InteropKind::ClrInterop).assert();

testProcess = System.Diagnostics.Process::Start(path, parameters);
testProcess.WaitForExit();

CodeAccessPermission::revertAssert();
посмотрел на getShortPathName, но неохота сейчас тратить время на исследование, будет время - попробую его переписать, но я сомневаюсь, что соответствующая функция не предоставлена через CLR.

UPD: всё-таки посмотрел быстро, я бы стал копать в сторону System.IO.Path.
Long story short: нужно найти аналог функции в CLR, а он сам разберётся, какая библиотека ему нужна в момент выполнения, 32 или 64
__________________
our sharp bitter vitriol is not that of the vulgar.

Последний раз редактировалось offenmeier; 11.02.2011 в 01:05.
Старый 11.02.2011, 04:57   #15  
offenmeier is offline
offenmeier
HAI; CAN HAS STDIO?
Аватар для offenmeier
Соотечественники
 
77 / 36 (2) +++
Регистрация: 17.02.2005
Адрес: Auckland, NZ
UPD 2: похоже, .NET Framework не поддерживает работу с 8.3 именами файлов как с пережитком прошлого так что не самый удачный пример.

мне нужен был shellExecute() на сервере, я его написал нужен будет shortPath, я луше свою реализацию напишу, раз в CLR его нет, благо правила описаны

http://support.microsoft.com/kb/142982
__________________
our sharp bitter vitriol is not that of the vulgar.
Старый 26.11.2013, 17:18   #16  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Кто-нибудь разобрался как использовать GZipStream для распаковки zip-архива ?
Везде примеры только для распаковки архива, состоящего из одного файла. А если их там несколько.
__________________
Дмитрий
Старый 26.11.2013, 19:58   #17  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Сообщение от Damn Посмотреть сообщение
Кто-нибудь разобрался как использовать GZipStream для распаковки zip-архива ?
Везде примеры только для распаковки архива, состоящего из одного файла. А если их там несколько.
Разбирался как то, получается что GZipStream ничего не знает о файловой структуре архива и может только паковать/распаковывать поток данных поданный на вход.
Только в .Net 4.5 появились нужные классы, например System.IO.Compression.ZipFile.
Самому требовалась еще возможность работать с запароленными архивами, вышел из положения установив сборку открытого проекта DotNetZip.
За это сообщение автора поблагодарили: Logger (3).
Теги
zip, архивирование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX 2009 Setup fails to install IIS Components on Windows Server 2008 R2 Blog bot DAX Blogs 0 12.01.2010 04:44
Dynamics AX Sustained Engineering: Microsoft Dynamics AX 4.0 and AX 2009 are compatible with Microsoft Windows 7 and Microsoft Windows Server 2008 R2 Blog bot DAX Blogs 0 22.09.2009 04:06
emeadaxsupport: Group policy setting "System Objects: Default owner for objects created by members of the administrators group" is missing on Windows Server 2008 Blog bot DAX Blogs 2 28.08.2009 02:14
jinx: Microsoft Dynamics AX 2009, Windows Server 2008 und SQL Server 2008 Blog bot DAX auf Deutsch 0 12.10.2008 20:10
Client Axapta 3.0 SP4 и Linux. Как запустить? Daiver DAX: Администрирование 10 28.06.2007 15:59

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

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

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