Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
ildar6994
7 / 4 / 2
Регистрация: 26.11.2012
Сообщений: 109
1

Распаковать определенный файл из архива

23.02.2013, 23:35. Просмотров 2432. Ответов 10
Метки нет (Все метки)

Всем привет, честное слово, уже замучался. Задача следующая: необходимо извлечь определенный файл (конкретно картинку (весит в любом архиве около 5кб)) в memorystream, вот есть код, работает, но нужно, чтобы он не перебирал все файлы в архиве, а просто перешел по строго заданному пути (переменная iconka) и извлек его в стрим... Помогите пожалуйста, заранее спасибо.
p.s. использую 7z.dll и sevenzip.pas

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm2.Button1Click(Sender: TObject);
var
  I          : Integer;
  MemStream  : TMemoryStream;
  St         : WideString;
  png        : TPNGObject;
  Archive    : I7zInArchive;
begin
  MemStream := TMemoryStream.Create;
  try
    Archive := CreateInArchive(CLSID_CFormatZip);
    Archive.OpenFile(extractfilepath(application.ExeName)+'files\'+form1.ADOQuery1.Fieldbyname('Файл').AsString);
    for I := 0 to Archive.NumberOfItems - 1 do
      if not Archive.ItemIsFolder[I] then
      begin
        St := LowerCase(Archive.ItemPath[I]);
        MemStream.Clear;
        Archive.ExtractItem(I, MemStream, False);
        MemStream.Position := 0;
        if St = iconka then
        begin
          png := TPNGObject.Create;
          try
            png.LoadFromStream(MemStream);
            Image1.Picture.Assign(png);
          finally
            png.Free;
          end;
        end;
      end;
  finally
    MemStream.Free;
  end;
end;
Добавлено через 13 минут
просто так слишком долго получается, если архив около 40мб весит и в нем огромнейшее количество маленьких файлов, которые он перебирает, чтобы найти нужный (если я правильно понимаю принцип работы).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 23:35
Ответы с готовыми решениями:

Как распаковать файл из ресурсов?
Нужна команда для кнопки, которая распакует файл из ресурсов программы. Если...

Нужно распаковать PCK-файл
Привет )) уважаемые программисты ОЧЕНЬ надо распаковать .PCK Уже кучу разных...

Если существует определенный файл, то выполнить заданное действие
Как зделать так чтобы, есть определёный фаил по пути например D:\123.txt И...

При выборе под-узла TreeView, в Memo загружать определенный текстовый файл
Подскажите как организовать такую штук : при выборе под вузла в TreeView, в...

Каждому символу строки присвоить определенный звуковой файл, а затем "воспроизвести" строку
Люди подскажите мне,как разбить строку на символы и обратно. Поясню. Есть...

10
RinatV
117 / 109 / 16
Регистрация: 15.05.2012
Сообщений: 325
Записей в блоге: 10
24.02.2013, 00:24 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TForm2.Button1Click(Sender: TObject);
var
  I          : Integer;
  MemStream  : TMemoryStream;
  St         : WideString;
  png        : TPNGObject;
  Archive    : I7zInArchive;
begin
  MemStream := TMemoryStream.Create;
  try
    Archive := CreateInArchive(CLSID_CFormatZip);
    Archive.OpenFile(extractfilepath(application.ExeName)+'files\'+form1.ADOQuery1.Fieldbyname('Файл').AsString);
    for I := 0 to Archive.NumberOfItems - 1 do
      if not Archive.ItemIsFolder[I] then
      begin
        St := LowerCase(Archive.ItemPath[I]);
        if St = iconka then
        begin
 
        MemStream.Clear;
        Archive.ExtractItem(I, MemStream, False);
        MemStream.Position := 0;
 
          png := TPNGObject.Create;
          try
            png.LoadFromStream(MemStream);
            Image1.Picture.Assign(png);
 
            Exit;
 
          finally
            png.Free;
          end;
        end;
      end;
  finally
    MemStream.Free;
  end;
end;
Я просто переместил Ваши 3 строки и добавил Exit как исполнено, но там можно и Break
Я бы еще поставил png := TPNGObject.Create; вверх и png.Free; в нижний finally, но кто его знает, может в этом есть какойто тайный смысл.
1
ildar6994
7 / 4 / 2
Регистрация: 26.11.2012
Сообщений: 109
24.02.2013, 00:34  [ТС] 3
RinatV, да, что-то не додумался я..) спасибо большое, работает гораздо быстрее, но все равно чувствуются промежутки времени, в то время как в программе с аналогичной фишкой (показ иконок) написанной тоже на делфи другим человеком (который любезно отказался помочь с этим делом) работает все в один миг.. Вот все думаю может попробовать что-то другое... Если есть идеи, пожалуйста подскажите)
0
Бородач
Заблокирован
24.02.2013, 00:40 4
Иконка в разных архивах по одному и тому же пути?
0
ildar6994
7 / 4 / 2
Регистрация: 26.11.2012
Сообщений: 109
24.02.2013, 16:16  [ТС] 5
Бородач, она по разному пути, но перед открытием картинки путь задается в переменной iconka (определяется автоматически) так что путь всегда известен.

Добавлено через 15 часов 22 минуты
ну есть варианты? путь всегда известен...
0
Бородач
Заблокирован
24.02.2013, 16:24 6
Наверняка есть, но я не работал с этой библиотекой
0
ildar6994
7 / 4 / 2
Регистрация: 26.11.2012
Сообщений: 109
24.02.2013, 17:55  [ТС] 7
Бородач, ну а что можете посоветовать, что быстрее работает, архив открывается как простой zip)
0
Бородач
Заблокирован
24.02.2013, 19:48 8
Ну как я понял файлам в архиве присваивается номер, Archive.NumberOfItems скажет сколько файлов в архиве, тут можно поискать некую закономерность, например в архиве 3 папки и в корне архива иконка, тоесть файл иконки получит последний номер и извлечь его не перебирая весь архив можно например так: Archive.ExtractItem(Archive.NumberOfItems - 1, MemStream, False); или же например не последний номер, а предпоследний.
Ну это я конечно образно, посмотри разные архивы и поищи какую нибудь закономерность
1
ildar6994
7 / 4 / 2
Регистрация: 26.11.2012
Сообщений: 109
24.02.2013, 20:33  [ТС] 9
Бородач, закономерности попросту нет))

Добавлено через 36 секунд
она может быть с любым именем, в любой подпапке)
0
Бородач
Заблокирован
24.02.2013, 20:43 10
А в этой библиотеке есть какой нибудь фильтр поиска файлов например по расширению? Посмотри другие подобные библиотеки, может там есть функционал лучше
0
ildar6994
7 / 4 / 2
Регистрация: 26.11.2012
Сообщений: 109
24.02.2013, 21:33  [ТС] 11
Бородач, честно, не могу разобраться есть ли в ней такой функционал)
0
24.02.2013, 21:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 21:33

распаковать
Мне надо что бы при запуске программы я нажимал на кнопку я в место где лежит...

Распаковать .exe
как можно раcпаковать .exe'шник? Т.е. для получения исходника(самые простые...

Распаковать zlib из сторки
По сети получаю от клиента такую строку <data>x┌ïV≥p⌡±±W╥⌐V*⌐,HU▓é±òJ╙ü<#C...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru