15.11.2007, 12:07 | #1 |
Участник
|
Как скачать и разархивировать файл
1. Есть файл в интернете, надо его скачать.
2. Файл заархивирован и имеет расширение .exe. Как его разархивировать? 3. При раархивации он создаст несколько других файлов, как мне узнать, как они называются? |
|
15.11.2007, 12:49 | #2 |
MCTS
|
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
15.11.2007, 15:42 | #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 |
|
15.11.2007, 18:56 | #4 |
Участник
|
Вопрос такой
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); не понятны вообще параметры |
|
15.11.2007, 19:07 | #5 |
Участник
|
Если есть четверка, можно поюзать .NET ные зиповские классы (правда, если тип архива известен и он zip)
Известен ли тип архива? |
|
15.11.2007, 19:25 | #6 |
MCTS
|
Цитата:
1. ret = _internetReadFile.call(hdl,_buffer,2000,_bytesRead); - что значит эта строка в приведенном примере в пункте 1.
Фактически это вызов функции InternetReadFile что обитает в 'WinInet.dll см. метод WinInet.new() - там объявляется эта функция
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
15.11.2007, 19:31 | #7 |
MCTS
|
Цитата:
2. Не понятно зачем
X++: X++: fileCreate.arg(ExtTypes::String, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord); 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 |
Участник
|
А теперь неадекватный вопрос
функцией WinApi::shellExecute( ) я открываю файл и тем самым его разархивирую. Все хорошо, кроме одного, как узнать , что он закончил разархивацию самораспаковывающегося архива. |
|
16.11.2007, 04:42 | #9 |
HAI; CAN HAS STDIO?
|
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 |
Участник
|
а почему этот метод не срабатывает
X++: WinApi::waitForSingleObject(hdl,#STATUS_TIMEOUT); |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|