![]() |
#3 |
Участник
|
Ну, я и в той ветке писал, что при распаковке архива может быть необходимость знать его содержимое. А здесь 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))); } } PPS. Сильно подозреваю, что нечто подобное есть и для zip-архивов
__________________
Axapta v.3.0 sp5 kr2 |
|