Ну, я и в той ветке писал, что при распаковке архива может быть необходимость знать его содержимое. А здесь 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-архивов