Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 20.08.2018, 12:50   #1
Ethex
Форумчанин
 
Регистрация: 26.04.2017
Сообщений: 81
Репутация: 10
По умолчанию VBA Распаковщик архивов

Доброго времени суток
Есть процедура, извлекающая файлы из архивов в подкаталогах
Код:

Public Sub UnRAR()
Dim winRarApp As String, archName As String
Dim fso, fold, subfold, file
Dim RetVal
    If Me.Поле0 <> 0 Then
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fold = fso.GetFolder(Me.Поле0)
        For Each subfold In fold.Subfolders
            For Each file In subfold.Files
                If file.Name Like "*rar" Or file.Name Like "*zip" Or file.Name Like "*7z" Then
                winRarApp = sWinRarAppPath & " E -o+"
                archName = subfold.Path & "\" & file.Name
                RetVal = Shell(winRarApp & " """ & archName & """ """ & subfold.Path & """ ", vbHide)
                End If
            Next
        Next
    Set fso = Nothing
    Else
    MsgBox "Каталог не выбран"
    End If
End Sub

Как я понял, строка
Код:

RetVal = Shell(winRarApp & " """ & archName & """ """ & subfold.Path & """ ", vbHide)

запускает процесс извлечения, после чего цикл идёт дальше, не дожидаясь пока файлы не будут извлечены. Когда я тестировал на каталоге, где было около 30 папок, вышло так, что процедура завершилась, оставив меня наблюдать порядка тридцати процессов извлечения файлов

А существует ли возможность как-нибудь приостановить выполнение цикла на время, нужное для извлечения файла(ов) и затем запустить его заново?
Ethex вне форума   Ответить с цитированием
Старый 20.08.2018, 12:53   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,482
Репутация: 2073
По умолчанию

http://www.cpearson.com/excel/ShellAndWait.aspx
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 20.08.2018, 17:33   #3
Ethex
Форумчанин
 
Регистрация: 26.04.2017
Сообщений: 81
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
http://www.cpearson.com/excel/ShellAndWait.aspx
Скопировал функцию. При компиляции выдаёт Method or data member not found в строке
Код:

SaveCancelKey = Application.EnableCancelKey

Ethex вне форума   Ответить с цитированием
Старый 20.08.2018, 17:39   #4
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,482
Репутация: 2073
По умолчанию

Ну напишите свою простую обертку. Там всего лишь не забыть сохранить пид и подождать в WaitForSingleObject
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 22.08.2018, 17:22   #5
Ethex
Форумчанин
 
Регистрация: 26.04.2017
Сообщений: 81
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну напишите свою простую обертку
Код:

Public Function wait(winRarApp As String, archName As String, subfoldPath As String)
Dim pID As Long, pHandle As Long, WaitProcess As Long
pID = Shell(winRarApp & " """ & archName & """ """ & subfoldPath & """ ", vbHide)
pHandle = OpenProcess(&H100000, True, pID)
WaitProcess = WaitForSingleObject(pHandle, INFINITE)
End Function

Собственно, копировать всю функцию пытался оттого что увидел много незнакомых слов и кода. Пришлось покумекать. Не буду врать что удалось полностью разобраться - это ещё предстоит. Но получилось то что выше. И оно работает. Спасибо за подробную наводку
Ethex вне форума   Ответить с цитированием
Старый 22.08.2018, 17:29   #6
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 12,482
Репутация: 2073
По умолчанию

Только не забывает закрывать хендл с помощью CloseHandle.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Старый 23.08.2018, 13:30   #7
Ethex
Форумчанин
 
Регистрация: 26.04.2017
Сообщений: 81
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Только не забывает закрывать хендл с помощью CloseHandle.
Агась, учтено
Ethex вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распаковщик на Delphi SDK Общие вопросы Delphi 19 02.05.2014 23:04
Распаковщик файла .sf darkdoren Общие вопросы C/C++ 4 03.08.2013 13:25
Хочу написать распаковщик формата Anton911 Общие вопросы Delphi 4 05.05.2012 10:43
bash-распаковщик архивов SNake Ice Помощь студентам 0 02.04.2011 04:31
Нужен распаковщик .ехе файлов Veselyn Софт 3 03.05.2009 06:24


09:58.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru