Показать сообщение отдельно
Старый 15.11.2007, 15:42   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2480 (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