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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.11.2007, 12:07   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Как скачать и разархивировать файл
1. Есть файл в интернете, надо его скачать.
2. Файл заархивирован и имеет расширение .exe. Как его разархивировать?
3. При раархивации он создаст несколько других файлов, как мне узнать, как они называются?
Старый 15.11.2007, 12:49   #2  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Как разархивить zip архив?
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 15.11.2007, 15:42   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ну, я и в той ветке писал, что при распаковке архива может быть необходимость знать его содержимое. А здесь Arahnid явно спрашивает об этом.

1. Для того, чтобы скачать файл с и-нета можно воспользоваться кодом отсюда Как сделать Image.loadFile по протоколу HTTP

2. 3. Если речь идет о rar-архиве, то можно скачать по адресу UnRarDll архив с dll-кой, с помощью которой можно разархиваровать и узнавать содержимое архива. Вот небольшой пример работы с этой dll-кой.
X++:
static void UnRarArchive(Args _args)
{
    #define.Success                 (0)
    #define.ERAR_END_ARCHIVE        (10)
    #define.ERAR_NO_MEMORY          (11)
    #define.ERAR_BAD_DATA           (12)
    #define.ERAR_BAD_ARCHIVE        (13)
    #define.ERAR_UNKNOWN_FORMAT     (14)
    #define.ERAR_EOPEN              (15)
    #define.ERAR_ECREATE            (16)
    #define.ERAR_ECLOSE             (17)
    #define.ERAR_EREAD              (18)
    #define.ERAR_EWRITE             (19)
    #define.ERAR_SMALL_BUF          (20)
    #define.ERAR_UNKNOWN            (21)
    #define.ERAR_MISSING_PASSWORD   (22)

    #define.RAR_OM_LIST           (0)
    #define.RAR_OM_EXTRACT        (1)

    #define.RAR_SKIP              (0)
    #define.RAR_TEST              (1)
    #define.RAR_EXTRACT           (2)

    dll dll = new Dll("d:\\Temp\\UnRar\\unrar.dll");
    DllFunction openArch = new DllFunction(dll, "RAROpenArchive");
    DllFunction closeArch = new DllFunction(dll, "RARCloseArchive");
    DllFunction readHeaderArch = new DllFunction(dll, "RARReadHeader");
    DllFunction processFileArch = new DllFunction(dll, "RARProcessFile");
    
    
    str archName = "c:\\Downloads\\UnRARDLL.exe"; // Путь и имя файла архива.

    Binary  RARHeaderData;
/*
struct RARHeaderData
{
  char ArcName[260];
  char FileName[260];
  UINT Flags;
  UINT PackSize;
  UINT UnpSize;
  UINT HostOS;
  UINT FileCRC;
  UINT FileTime;
  UINT UnpVer;
  UINT Method;
  UINT FileAttr;
  char *CmtBuf;
  UINT CmtBufSize;
  UINT CmtSize;
  UINT CmtState;
};
*/

    Binary  RAROpenArchiveData = new Binary(28);
    Binary  ptr = new Binary(strlen(archName)+1);
    int archHandle;
    str s;
/*
struct RAROpenArchiveData
{
  char *ArcName;
  UINT OpenMode;
  UINT OpenResult;
  char *CmtBuf;
  UINT CmtBufSize;
  UINT CmtSize;
  UINT CmtState;
};   */
    ;
    processFileArch.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::String, ExtTypes::DWord);
    processFileArch.returns(ExtTypes::DWord);
    readHeaderArch.arg(ExtTypes::DWord, ExtTypes::Pointer);
    readHeaderArch.returns(ExtTypes::DWord);

    ptr.string(0, archName);
    openArch.arg(ExtTypes::Pointer);
    openArch.returns(ExtTypes::DWord);
    RAROpenArchiveData.Binary(0, ptr);
//    RAROpenArchiveData.DWord(4, #RAR_OM_LIST); // Если необходимо просмотреть содержимое архива
    RAROpenArchiveData.DWord(4, #RAR_OM_EXTRACT); // Если необходимо извлечь файлы из архива
    archHandle = openArch.call(RAROpenArchiveData);

    if (archHandle)
    {
        do
        {
            RARHeaderData = new Binary(572);
            if (readHeaderArch.call(archHandle, RARHeaderData) == #Success)
            {
                s = RARHeaderData.String(260);
                if (RARHeaderData.dWord(260*2) & 0xe0 != 0xe0)
                    info(s);
            }
            else
                break;
        }
        while (processFileArch.call(archHandle, #RAR_EXTRACT, "C:\\Temp\\Arch", 0) == #Success);
        // Третий параметр - путь, куда будут помещены разархиварованные файлы 
        // Если в архиве есть папки, то файлы будут содержаться в них

        CloseArch.arg(ExtTypes::DWord);
        CloseArch.returns(ExtTypes::DWord);
        CloseArch.call(archHandle);
    }
    else
    {
        info(strfmt("%1", RAROpenArchiveData.DWord(8)));
    }
}
PS. Если попытаться открыть zip-архив, то вернет код ошибки 13 - неверный формат архива
PPS. Сильно подозреваю, что нечто подобное есть и для zip-архивов
__________________
Axapta v.3.0 sp5 kr2
Старый 15.11.2007, 18:56   #4  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Вопрос такой

1. ret = _internetReadFile.call(hdl,_buffer,2000,_bytesRead); - что значит эта строка в приведенном примере в пункте 1.

2. Не понятно зачем
X++:
fileCreate.arg(ExtTypes::String,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord);
что это значит и зачем DWord?
не понятны вообще параметры
Старый 15.11.2007, 19:07   #5  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Если есть четверка, можно поюзать .NET ные зиповские классы (правда, если тип архива известен и он zip)

Известен ли тип архива?
Старый 15.11.2007, 19:25   #6  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
1. ret = _internetReadFile.call(hdl,_buffer,2000,_bytesRead); - что значит эта строка в приведенном примере в пункте 1.
Посмотрите класс WinInet
Фактически это вызов функции InternetReadFile что обитает в 'WinInet.dll
см. метод WinInet.new() - там объявляется эта функция
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 15.11.2007, 19:31   #7  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
2. Не понятно зачем

X++:
X++:
fileCreate.arg(ExtTypes::String,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord,
                        ExtTypes::DWord);
А это объявляются параметры апишной функции CreateFile, дабы те(параметры) стали "понятны" Аксапте
X++:
HANDLE CreateFile(

    LPCTSTR lpFileName,	// pointer to name of the file 
    DWORD dwDesiredAccess,	// access (read-write) mode 
    DWORD dwShareMode,	// share mode 
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,	// pointer to security attributes 
    DWORD dwCreationDistribution,	// how to create 
    DWORD dwFlagsAndAttributes,	// file attributes 
    HANDLE hTemplateFile 	// handle to file with attributes to copy  
   );
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню

Последний раз редактировалось Russland; 15.11.2007 в 20:01.
Старый 16.11.2007, 00:00   #8  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
А теперь неадекватный вопрос

функцией WinApi::shellExecute( )
я открываю файл и тем самым его разархивирую. Все хорошо, кроме одного, как узнать , что он закончил разархивацию самораспаковывающегося архива.
Старый 16.11.2007, 04:42   #9  
offenmeier is offline
offenmeier
HAI; CAN HAS STDIO?
Аватар для offenmeier
Соотечественники
 
77 / 36 (2) +++
Регистрация: 17.02.2005
Адрес: Auckland, NZ
take a look here.

I will always use SEARCH before asking WHERE TO SEARCH the things that just cannot be used to SEARCH for them to make me so bored that I cannot use the SEARCH again (c)
__________________
our sharp bitter vitriol is not that of the vulgar.
Старый 16.11.2007, 16:22   #11  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
а почему этот метод не срабатывает

X++:
    WinApi::waitForSingleObject(hdl,#STATUS_TIMEOUT);
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Web-портал: открыть файл cherv DAX: Программирование 4 19.05.2008 16:42
Большой Log файл у базы. Что делать? Arahnid DAX: Администрирование 4 04.04.2007 16:10
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 16 09.10.2006 19:10
Как отправить файл с кодами, понятными принтеру, в порт принтера? miaa DAX: Программирование 19 18.05.2006 19:18
Отчет записать сразу как RTF файл st_msav DAX: Программирование 2 17.01.2006 18:52

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

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

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