|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip |
|
||||
|
|
Delphi - [sevenzip] Как распаковать определённый файл из архива 7zip
|
|
Ветеран Сообщения: 1158 |
Всем привет! Есть задача распаковать определённый файл из архива 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 | |
|