Надстройка над архиватором 7zip

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Надстройка над архиватором 7zip

Сообщение Dimon111 » 14.02.2008 (Чт) 16:24

В Сети ничего толкового не нашел - решил сделать сам. Программа архивирует все папки (в своем директории) в архивы с теми же названиями. Выводится общее время работы. Последовательно запускается графический 7-zip, для архивации каждой папки.

Но вот вопрос - процесс запускается либо с приоритетом "Нормальный" (NORMAL_PRIORITY_CLASS = &H20), либо "низкий" (IDLE_PRIORITY_CLASS = &H40). Но в диспетчере задач Windows есть еще "ниже среднего". Как его обеспечить?

Хочу сделать приоритет "ниже среднего" (чтоб неповадно было!)
Вот код программы, может кому интересно будет:
Код: Выделить всё
Public Enum PriorityEnum
  NORMAL_PRIORITY_CLASS = &H20
  IDLE_PRIORITY_CLASS = &H40
  HIGH_PRIORITY_CLASS = &H80
End Enum

Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, ByVal lpCommandLine _
As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As _
STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const INFINITE = -1&
Private Const STARTF_USESHOWWINDOW = &H1
Private Type STARTUPINFO
  cb As Long
  lpReserved As String
  lpDesktop As String
  lpTitle As String
  dwX As Long
  dwY As Long
  dwXSize As Long
  dwYSize As Long
  dwXCountChars As Long
  dwYCountChars As Long
  dwFillAttribute As Long
  dwFlags As Long
  wShowWindow As Integer
  cbReserved2 As Integer
  lpReserved2 As Long
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type
Private Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessID As Long
  dwThreadID As Long
End Type

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal _
lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Option Explicit
'-----------------------------DIR-------------------------------------
Private Sub I7zip_Click()                    'подпрограмма обработки нажатия кнопки dir
Dim Tmp As String, I As Integer, Kstr As String, DirArray() As String, Elaps As Date, Exist As Boolean
Elaps = Time                                 'Для вычисления времени работы
Kstr = App.Path                              'Запись текущего пути
If Right$(Kstr, 1) <> "\" Then Kstr = Kstr & "\" 'Переход на уровень вниз
Tmp = Dir(Kstr, vbDirectory)                 'Первый вызов функции Dir
Do Until Len(Tmp) = 0                        'Выполнять, пока не получим пустой директорий
    ReDim Preserve DirArray(I)               'Расширение массива
    DirArray(I) = Tmp                        'Запись очередного элемента
    Okno1.Text = Okno1.Text & DirArray(I) + Chr(13) + Chr(10)
    I = I + 1                                'Следующий элемент
    Tmp = Dir()                              'Вызов Dir внутри цикла
Loop                                         '
Okno1.Text = Okno1.Text & String(78, "-") + Chr(13) + Chr(10)
For I = LBound(DirArray) To UBound(DirArray) 'Цикл до окончания файла - шаблона
    Kstr = DirArray(I)                       'загрузить строку из файла - листинга
    Exist = InStr(Kstr, ".")                 'обрабатывать только каталоги
    If Exist = 0 Then Okno1.Text = Okno1.Text + "C:\Progra~1\7-Zip\7zg.exe A " & Kstr + " " + Kstr + "\" + Chr(13) + Chr(10)
    If Exist = 0 Then SystemExecute "C:\Progra~1\7-Zip\7zg.exe  A " + Kstr + " " + Kstr + "\"
Next                                         'цикл создания bat - файла архивации
ElapsTime.Caption = "Время работы: " & Format(Time - Elaps, "hh:mm:ss") 'Вывод времени работы
MsgBox "Все ваши чертовы задания готовы"     'добавить оператор паузы в bat - файл
End Sub                                      'конец подпрограммы обработки нажатия кнопки dir
'---------------------------выход---------------------------------------
Private Sub CommEXIT_Click()                 'обработчик кнопки Выход
End                                          'выход из программы
End Sub                                      '
'---------------------------Таймер---------------------------------------
Private Sub Timer1_Timer()                                                  'Обработчик часов
    LabelTime.Caption = Format(Now, "hh:mm:ss, dddd, d mmmm")               'Отображение даты и времени
End Sub                                                                     '
Private Sub Descript_Click()
MsgBox "Программа архивирует все папки (в своем директории) в архивы с теми же названиями. Выводится общее время работы. Последовательно запускается графический 7-zip, для архивации каждой папки."
End Sub
'А это и есть тот чудесный код, который сделал из моего говна настоящую программу
'Show: SW_HIDE = 0, SW_NORMAL = 1, SW_MAXIMIZE = 3, SW_MINIMIZE = 6
Public Function SystemExecute(ByRef CmdLine As String, Optional Show = 1) As Long
Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO
Dim Res As Long
  ' Initialize the STARTUPINFO structure:
  start.cb = Len(start)
  start.dwFlags = STARTF_USESHOWWINDOW
  start.wShowWindow = Show
  ' Start the shelled application:
  Res = CreateProcessA(0&, CmdLine$, 0&, 0&, 1&, IDLE_PRIORITY_CLASS, 0&, 0&, start, proc)
  ' Wait for the shelled application to finish:
  Res = WaitForSingleObject(proc.hProcess, INFINITE)
  Call GetExitCodeProcess(proc.hProcess, Res)
  Call CloseHandle(proc.hThread)
  Call CloseHandle(proc.hProcess)
  SystemExecute = Res
End Function



Готов впитать всю критику. Это моя первая программа на VB. Вообще - то я уже засомневался - а можно ли здесь приводить полный текст?
Последний раз редактировалось Dimon111 14.02.2008 (Чт) 18:33, всего редактировалось 1 раз.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.02.2008 (Чт) 17:25

Наверное ничего, но проверить не могу, нет этого архиватора.
И когда копируешь откуда-то текст с русскими символами переключи плз, раскладку на русскую перед копированием.

Elaps As Variant - почему не Date
Мне кажется здесь:
Код: Выделить всё
Do Until Len(Tmp) = 0                       
    ReDim Preserve DirArray(I)               
    DirArray(I) = Tmp                       
    Okno1.Text = Okno1.Text & DirArray(I) + Chr(13) + Chr(10)
    I = I + 1                               
    Tmp = Dir()                             
Loop

было бы проще все складывать в переменную типа стринг и потом выводить её в Okno1.Text, а также Split'ом разделить на составляющие, т.е сделать так:
Код: Выделить всё
Dim sTemp as String
Do Until Len(Tmp) = 0                       
    sTemp = sTemp & Tmp & vbCrLf
    Tmp = Dir()                             
Loop
Okno1.Text = sTemp
DirArray = Split(sTemp, vbCrLf)


Ну примерно так, есть ещё моменты, но это уже шлифовка
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Сообщение Dimon111 » 14.02.2008 (Чт) 18:30

Точно, исправил на Date.

До Split я не додумался. Я так понял строка
Код: Выделить всё
DirArray = Split(sTemp, vbCrLf)

Убирает CRLF и записывает в массив. CRLF не должно быть в конце строки, т.к. 7zip при этом извлит ругаться.

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 14.02.2008 (Чт) 18:51

а его и не будет :)
Split не включает символ разделитель в результат
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Dragon
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 18.02.2008 (Пн) 10:11

Сообщение Dragon » 18.02.2008 (Пн) 10:25

Igor_123 писал(а):Split не включает символ разделитель в результат

Во прикол... Спасибо, что прояснил.У мну в справке написано, что *Сплит - функция, разделяющая строку символов на массив строк при нахождении разделителя и заменяющая его на пробелы*
А я то блин еще Replace'ом пробелы убирал - зря...

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 18.02.2008 (Пн) 10:38

Dragon да возьми и поэксперементируй! Будешь открывать для себя новый и удивительный мир VB6 ;-)
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.02.2008 (Пн) 10:43

Dragon писал(а):*Сплит - функция, разделяющая строку символов на массив строк при нахождении разделителя и заменяющая его на пробелы*

Вот бред то! Это в какой справке такое писано???
Весь мир матрица, а мы в нем потоки байтов!

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 18.02.2008 (Пн) 10:48

Viper судя по русскому языку цитирования :D используется какой-то недоперевод :)
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Dragon
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 18.02.2008 (Пн) 10:11

Сообщение Dragon » 20.02.2008 (Ср) 12:02

Да уж, ставлю МСДН. А справочник-то ~500кб, перевод внатуре никакой.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 84

    TopList