|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip |
|
|
Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip
|
Ветеран Сообщения: 1158 |
Профиль | Отправить PM | Цитировать
Всем привет! Есть задача распаковать определённый файл из архива 7zip. Воспользовался модулем (прикрепил к теме).
Использую функцию uses ...sevenzip, ... function SevenZip_ExtractFile(const aInterf: I7zInArchive; const aPath: string; const aSavePath: string): Boolean; var i, indx: Integer; fs: TFileStream; s1, s2: string; begin Result := False; indx := -1; for i := 0 to aInterf.NumberOfItems - 1 do begin if (not aInterf.ItemIsFolder[i]) then begin s1 := LowerCase(Trim((aInterf.ItemPath[i] + aInterf.ItemName[i]))); s2 := LowerCase(Trim(aPath)); if (s1 = s2) then begin indx := i; Break; end; end; end; if (indx <> -1) then begin try fs := TFileStream.Create(aSavePath, fmCreate or fmOpenWrite); try aInterf.ExtractItem(indx, fs, False); Result := True; finally FreeAndNil(fs); end; except Result := False; end; end; end; // Пытаюсь распаковать: procedure TForm1.Button1Click(Sender: TObject); var Zz: I7zInArchive; begin Zz:= CreateInArchive(CLSID_CFormat7z); Zz.OpenFile('C:\hidcon.7z'); if SevenZip_ExtractFile(Zz,'hidcon_x64.exe','C:\3333') then begin caption:='1' end else begin caption:='0' ; end; end; end. Решил проблему так : Новый модуль прикрепил к теме . Сам код : uses SevenZipIntf function SevenZip_ExtractFile(const aInterf: I7zInArchive; const aPath: string; const aSavePath: string): Boolean; var i, indx: Integer; fs: TFileStream; s1, s2: string; begin Result := False; indx := -1; for i := 0 to aInterf.NumberOfItems - 1 do begin if (not aInterf.ItemIsFolder[i]) then begin s1 := LowerCase(Trim((aInterf.ItemPath[i] + aInterf.ItemName[i]))); s2 := LowerCase(Trim(aPath)); if (s1 = s2) then begin indx := i; Break; end; end; end; if (indx <> -1) then begin try fs := TFileStream.Create(aSavePath, fmCreate or fmOpenWrite); try aInterf.ExtractItem(indx, fs, False); Result := True; finally FreeAndNil(fs); end; except Result := False; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var Zz: I7zInArchive; begin Zz:= CreateInArchive(CLSID_CFormat7z,'директория где лежит 7z.dl'); Zz.OpenFile('C:\sevenzip.7z'); if SevenZip_ExtractFile(Zz,'sevenzip.pas','C:\sevenzip.pas') then begin caption:='готово' end else begin caption:='ошибка' ; end; end; |
|
------- Отправлено: 12:49, 03-10-2018 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать Как всегда проблему решил сам. Вопрос решён . Нашёл модуль по новее и чуть переписал функцию и всё заработало
|
------- Отправлено: 22:14, 03-10-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 22:34, 03-10-2018 | #3 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
------- Отправлено: 23:32, 03-10-2018 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Painkiller, спасибо! Родина Вас не забудет !
|
|
Отправлено: 00:21, 04-10-2018 | #5 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
------- Отправлено: 00:53, 04-10-2018 | #6 |
Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Цитата Painkiller:
// ---------------------------------------------------------------------- { распаковать архив } procedure Unzip7z_All(aCompressFileName: string); var Zz: I7zInArchive; outDir: string; begin Zz := CreateInArchive(CLSID_CFormat7z); with Zz do // интерфейс архива begin OpenFile(aCompressFileName); // имя архива outDir := ChangeFileExt(aCompressFileName, ''); // выходной каталог ForceDirectories(outDir); // создать ExtractTo(outDir); end; end; { применение } procedure TForm1.btn1Click(Sender: TObject); begin Unzip7z_All(ExtractFilePath(Application.ExeName) + 'Архив.7z'); end; // ---------------------------------------------------------------------- { извлечь файл из архива } Unzip7z_ExtractFile(const aCompressFileName: string; const aOutSaveFileName: string): Boolean; var fs: TFileStream; i: Integer; InArchive: I7zInArchive; Item: string; begin Result := False; if not FileExists(aCompressFileName) then begin ShowMessage('File no found'); Exit; end; InArchive := CreateInArchive(CLSID_CFormat7z); try try InArchive.OpenFile(aCompressFileName); if InArchive.NumberOfItems > 0 then begin for i := 0 to InArchive.NumberOfItems - 1 do begin Item := InArchive.ItemPath[i]; if not InArchive.ItemIsFolder[i] then begin if Item = ( { 'Имя папки в архиве\' + } ExtractFileName(aOutSaveFileName)) then begin if FileExists(aOutSaveFileName) then DeleteFile(aOutSaveFileName); fs := TFileStream.Create(aOutSaveFileName, fmCreate or fmOpenWrite); try InArchive.ExtractItem(i, fs, False); finally FreeAndNil(fs); end; end; end; Break; end; end; except on E: Exception do begin Result := False; end; end; finally InArchive := nil; end; end; { применение } procedure TForm1.btn2Click(Sender: TObject); begin if Unzip7z_ExtractFile(ExtractFilePath(Application.ExeName) + 'Архив.7z', 'Имя файла.txt') then ShowMessage('No found file'); end; |
|
------- Последний раз редактировалось opel431, 04-10-2018 в 11:18. Отправлено: 09:33, 04-10-2018 | #7 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать opel431, ай -яй -яй
procedure Unzip7z_All(aCompressFileName: string); var Zz: I7zInArchive; outDir: string; begin Zz := CreateInArchive(CLSID_CFormat7z); with Zz do // интерфейс архива begin OpenFile(aCompressFileName); // имя архива outDir := ChangeFileExt(aCompressFileName, ''); // выходной каталог ForceDirectories(outDir); // создать ExtractTo(outDir); end; end; { применение } procedure TForm1.btn1Click(Sender: TObject); begin Unzip7z_All(ExtractFilePath(Application.ExeName) + 'Архив.7z'); end; procedure Unzip7z_All(aCompressFileName, outDir: string); var Zz: I7zInArchive; begin Zz := CreateInArchive(CLSID_CFormat7z); with Zz do // интерфейс архива begin OpenFile(aCompressFileName); // имя архива ForceDirectories(outDir); // создать ExtractTo(outDir); end; end; { применение } procedure TForm1.btn1Click(Sender: TObject); begin Unzip7z_All(ExtractFilePath(Application.ExeName) + 'Архив.7z' , 'путь распаковки'); end; Unzip7z_ExtractFile(const aCompressFileName: string; const aOutSaveFileName: string): Boolean; var fs: TFileStream; i: Integer; InArchive: I7zInArchive; Item: string; begin Result := False; if not FileExists(aCompressFileName) then begin ShowMessage('File no found'); Exit; end; InArchive := CreateInArchive(CLSID_CFormat7z); try try InArchive.OpenFile(aCompressFileName); if InArchive.NumberOfItems > 0 then begin for i := 0 to InArchive.NumberOfItems - 1 do begin Item := InArchive.ItemPath[i]; if not InArchive.ItemIsFolder[i] then begin if Item = ( { 'Имя папки в архиве\' + } ExtractFileName(aOutSaveFileName)) then begin if FileExists(aOutSaveFileName) then DeleteFile(aOutSaveFileName); fs := TFileStream.Create(aOutSaveFileName, fmCreate or fmOpenWrite); try InArchive.ExtractItem(i, fs, False); finally FreeAndNil(fs); end; end; end; Break; end; end; except on E: Exception do begin Result := False; end; end; finally InArchive := nil; end; end; { применение } procedure TForm1.btn2Click(Sender: TObject); begin if Unzip7z_ExtractFile(ExtractFilePath(Application.ExeName) + 'Архив.7z', 'Имя файла.txt') then ShowMessage('No found file'); end; |
------- Последний раз редактировалось Painkiller, 04-10-2018 в 12:13. Отправлено: 12:03, 04-10-2018 | #8 |
Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Цитата Painkiller:
|
|
------- Последний раз редактировалось opel431, 04-10-2018 в 12:59. Отправлено: 12:50, 04-10-2018 | #9 |
Ветеран Сообщения: 1158
|
Профиль | Отправить PM | Цитировать opel431, я не знаю как распаковать определённую папку из архива , а не целый архив . С файлом и так понятно уже, решил сам как всегда, зачем возвращаться к этому ?
Так же интересует вопрос : Цитата Painkiller:
Цитата opel431:
|
||
------- Последний раз редактировалось Painkiller, 04-10-2018 в 14:04. Отправлено: 13:50, 04-10-2018 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как распаковать файл формата nanddump? | Diman19 | Хочу все знать | 1 | 22-02-2018 23:53 | |
CMD/BAT - [решено] Извлечь из архива только определенную папку/определенный файл | SharkyEXE | Скриптовые языки администрирования Windows | 34 | 09-08-2017 22:34 | |
Утилита для создания/изменения 7zip SFX-архива | XXXler | Автоматическая установка Windows 2000/XP/2003 | 38 | 24-06-2017 14:23 | |
Разное - Как "спасти" файл из повреждённого архива ? | MKN | Программирование и базы данных | 1 | 03-03-2008 11:06 | |
Как распаковать файл на удаленном компе? | phpbook | Вебмастеру | 3 | 10-06-2004 22:31 |
|