Что нового

[Файловая система] Данные о архивах

Freesty1er

Новичок
Сообщения
7
Репутация
0
Версия AutoIt: 3.3.6.1

Описание: Нужна программа, которая могла брать информацию о архивах из определенной папки (что бы можно было указывать путь в программе/скрипте или же из той папке, где находится исполняемый файл) в текстовый документ. А именно информацию о количестве файлов, размере архива (лучше в МБ, но можно в чём угодно) и название архива. Сохраняло это всё в текстовый документ, разделяя запятыми.
Архивы как .RAR так и .ZIP (можно разные программы для разных архивов).
Пример:
Код:
nero6.rar,31,87.65
iaud.zip,98,0.31
или
Код:
nero9.rar,131,41.51 Mb
Имя, Количество Файлов, Вес архива (можно и в другой последовательности).

Примечания: Если размер файла будет с запятой (15,340 МБ), можно использовать другой разделитель, к примеру ";". Это не так важно.

Заранее благодарен :IL_AutoIt_1:
 
Автор
F

Freesty1er

Новичок
Сообщения
7
Репутация
0
Вот есть скрипт (спасибо CreatoR'y) для подсчета файлов во всех ZIP архивах. Переделать бы его как-то :wacko:

Код:
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#include "7Zip.au3"

$Form1 = GUICreate("Подсчет документов", 507, 70, 192, 124)
$Progress1 = GUICtrlCreateProgress(8, 32, 489, 9)
$Label1 = GUICtrlCreateLabel("Кол-во доков", 8, 8, 36, 17)
$Button1 = GUICtrlCreateButton('Go', 8, 45, 30, 17)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            Dim $aRecords[10][2]
            $DirUpd = FileSelectFolder('Выбери папку с архивами', "", 0, "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")
           
            If @error Then
                MsgBox(4096, "Error", "Директория не выбрана!")
            Else
                $nCount = 0
                $PosPogr = 0
                $DPos = 100 / 3992
               
                $aFiles = _FilesList($DirUpd, "*.zip")
               
                For $i = 1 To $aFiles[0]
                    $nCount += _7ZipGetFileCount($aFiles[$i])
                    $PosPogr += $DPos
                    GUICtrlSetData($Label1, "В архиве файлов: " & $nCount)
                    GUICtrlSetData($Progress1, $PosPogr)
                Next
               
                MsgBox(4096, "Damp:", 'В архиве файлов: ' & $nCount)
            EndIf
    EndSwitch
WEnd

Func _FilesList($sPath, $sFileMask)
    Local $sOut, $aOut, $hDir

    $sOut = StringToBinary("0" & @CRLF, 2)
    $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $sFileMask & '" /S /B /A-D', @SystemDir, @SW_HIDE, 6)

    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    WEnd

    $aOut = StringRegExp(BinaryToString($sOut, 2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut) - 1
    Return $aOut
EndFunc
Для работы скрипта, нужны 2 файла: 7Zip.au3 (в папку Includes) и 7-zip32.dll (помещать в папку со скриптом).
Скачать можно здесь: http://rghost.ru/3289423
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Freesty1er
Вас такой алгоритм устроит:
Открывается окно, на которое можно перетащить или выбрать папку с архивными файлами для анализа. Архивные файлы анализируются с помощью консольного 7z.exe и в окне выводится информация о них (имя, размер в кб, кол-во файлов в архиве, кол-во папок в архиве, тип архива). Эту информацию можно сохранить в текстовый файл как всю, так и по типу архива.
 
Автор
F

Freesty1er

Новичок
Сообщения
7
Репутация
0
madmasles сказал(а):
Freesty1er
Вас такой алгоритм устроит:
Открывается окно, на которое можно перетащить или выбрать папку с архивными файлами для анализа. Архивные файлы анализируются с помощью консольного 7z.exe и в окне выводится информация о них (имя, размер в кб, кол-во файлов в архиве, кол-во папок в архиве, тип архива). Эту информацию можно сохранить в текстовый файл как всю, так и по типу архива.
Да, конечно. :ok:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Freesty1er
Вот что у меня получилось:
Код:
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=1_Icon.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Description=Информация об архивах.
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
	AutoIt Version: 3.3.6.1
	Author:         madmasles
	
	Script Function:
	Получение информации об архивных файлах из выбранной папки и сохранение ее в файл
#ce ----------------------------------------------------------------------------
#region Include
#include <Constants.au3>
#include <File.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>
#include <Timers.au3>
#include <GuiComboBoxEx.au3>
#include <EditConstants.au3>
#include <ProgressConstants.au3>
#endregion Include

#region Opt
Opt('MustDeclareVars', 1)
Opt("TrayMenuMode", 1)
#endregion Opt

If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

#region Variables
;===========
;типы архивов и индексы иконок к ним в файле Icons.icl
Dim $aIcons[35][2] = [['7z', 0],['zip', 1],['bz2', 2],['bzip2', 2],['tbz2', 2],['tbz', 2], _
		['rar', 3],['arj', 4],['z', 5],['taz', 5],['lzh', 6],['lha', 6],['cab', 7], _
		['iso', 8],['001', 9],['rpm', 10],['deb', 11],['cpio', 12],['tar', 13],['gz', 14], _
		['gzip', 14],['tgz', 14],['tpz', 14],['wim', 15],['swm', 15],['lzma', 16], _
		['dmg', 17],['hfs', 18],['xar', 19],['vhd', 20],['fat', 21],['ntfs', 22],['xz', 23], _
		['txz', 23],['PE', 24]]
;===========
;переменные окна
Global $hImageList, $hGUI, $InputPath, $ButtonSelect, $ButtonSave, $ButtonGet, $InputSave, _
		$ListView, $hListView, $hCombo, $nMsg, $Progress, $Label
Global $sTitle = 'Файлы архивов - информация.'
;другие переменные
Global $iCheckInstall_7z, $iCheckInstall_Icons, $iCheckInstall_Dll;проверка для FileInstall
Global $sMessageError = 'Произошла какая-то ошибка.' & @CRLF & _
		'Попробуйте запустить программу еше раз.'
Global $iCheckAddIcon;проверка для _GUIImageList_AddIcon
Global $q = 0;счетчик для типов файлов
Global $j = 0;счетчик для архивных файлов
Global $iCheckSave;проверка для _SaveInfo()
Global $iID = 0;проверка для _ToolTipCombo()
Global $iCheckDrop;проверка для _DropFolder()
Global $iCheckSelect;проверка для _SelectFolder()
Global $iCheckGet;проверка для _GetArchivesInfo()
#endregion Variables

#region Start
For $i = 1 To 5
	$iCheckInstall_Dll = FileInstall('7z.dll', @TempDir & '\7z.dll', 1)
	If $iCheckInstall_Dll Then ExitLoop
Next
If Not $iCheckInstall_Dll Then
	MsgBox(16, $sTitle, $sMessageError)
	Exit
EndIf
For $i = 1 To 5
	$iCheckInstall_7z = FileInstall('7z.exe', @TempDir & '\7z.exe', 1)
	If $iCheckInstall_7z Then ExitLoop
Next
If Not $iCheckInstall_7z Then
	MsgBox(16, $sTitle, $sMessageError)
	Exit
EndIf
For $i = 1 To 5
	$iCheckInstall_Icons = FileInstall('Icons.icl', @TempDir & '\Icons.icl', 1)
	If $iCheckInstall_Icons Then ExitLoop
Next
If Not $iCheckInstall_Icons Then
	MsgBox(16, $sTitle, $sMessageError)
	Exit
EndIf
For $i = 1 To 5
	$hImageList = _GUIImageList_Create(16, 16, 5, 1)
	If $hImageList Then ExitLoop
Next
If Not $hImageList Then
	MsgBox(16, $sTitle, $sMessageError)
	Exit
EndIf
For $i = 0 To 25
	For $w = 1 To 5
		$iCheckAddIcon = _GUIImageList_AddIcon($hImageList, @TempDir & '\Icons.icl', $i)
		If $iCheckAddIcon <> -1 Then ExitLoop
	Next
	If $iCheckAddIcon = -1 Then
		MsgBox(16, $sTitle, $sMessageError)
		Exit
	EndIf
Next
#endregion Start

#region GUICreate

$hGUI = GUICreate($sTitle, 540, 330, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0xFFFFCC)
$InputPath = GUICtrlCreateInput('', 10, 10, 490, 20, _
		BitOR($GUI_SS_DEFAULT_INPUT, $ES_LEFT, $ES_READONLY))
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetTip(-1, 'Перетащите сюда папку с архивными' & @CRLF & _
		'файлами или кликните по кнопке справа.', $sTitle, 1, 3)
$ButtonSelect = GUICtrlCreateButton('...', 505, 10, 25, 20)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Выбрать папку с архивными файлами.', $sTitle, 1, 3)

$ButtonGet = GUICtrlCreateButton('Получить', 20, 40, 100, 25)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Получить информацию об архивных файлах из выбранной папки.', $sTitle, 1, 3)
GUICtrlSetState(-1, $GUI_DISABLE)

$InputSave = GUICtrlCreateInput('', 280, 43, 100, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_LEFT))
GUICtrlSetTip(-1, 'Имя файла для отчета. Вы можете изменить его на любое другое.', $sTitle, 1, 3)

$ButtonSave = GUICtrlCreateButton('Сохранить', 420, 40, 100, 25)
GUICtrlSetCursor(-1, 0)
GUICtrlSetTip(-1, 'Сохранить информацию об архивных файлах в файл.', $sTitle, 1, 3)
GUICtrlSetState(-1, $GUI_DISABLE)

$ListView = GUICtrlCreateListView('', 5, 75, 530, 200, $LVS_SHOWSELALWAYS, _
		BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
$hListView = GUICtrlGetHandle($ListView)
_GUICtrlListView_SetBkColor($hListView, $CLR_MONEYGREEN)
_GUICtrlListView_SetTextColor($hListView, $CLR_BLACK)
_GUICtrlListView_SetTextBkColor($hListView, $CLR_MONEYGREEN)
_GUICtrlListView_AddColumn($hListView, 'Имена архивов', 200, 2)
_GUICtrlListView_AddColumn($hListView, 'Размер', 75, 2)
_GUICtrlListView_AddColumn($hListView, 'Файлов', 75, 2)
_GUICtrlListView_AddColumn($hListView, 'Папок', 75, 2)
_GUICtrlListView_AddColumn($hListView, 'Тип', 75, 2)
_GUICtrlListView_SetImageList($hListView, $hImageList, 1)

$hCombo = _GUICtrlComboBoxEx_Create($hGUI, 'все', 160, 42, 80, 100)
_GUICtrlComboBoxEx_SetImageList($hCombo, $hImageList)
_GUICtrlComboBoxEx_SetCurSel($hCombo, 0)
_GUICtrlComboBoxEx_SetItemSelectedImage($hCombo, 0, 25)

$Progress = GUICtrlCreateProgress(10, 300, 520, 20, $PBS_SMOOTH)
GUICtrlSetState(-1, $GUI_HIDE)
$Label = GUICtrlCreateLabel('', 30, 280, 200, 17)
GUICtrlSetState(-1, $GUI_HIDE)

GUISetState()
#endregion GUICreate

#region Work
AdlibRegister('_ToolTipCombo', 50)
AdlibRegister('_No_Change_Combo', 50)

_WinAPI_EmptyWorkingSet()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			FileDelete(@TempDir & '\7z.exe')
			FileDelete(@TempDir & '\7z.dll')
			FileDelete(@TempDir & '\Icons.icl')
			Exit
		Case $GUI_EVENT_DROPPED
			For $i = 1 To 5
				$iCheckDrop = _DropFolder()
				If $iCheckDrop Then ExitLoop
			Next
			If Not $iCheckDrop Then
				_ToolTipEx('Произошла ошибка перетаскивания папки.', _
						Default, Default, $sTitle, 1, 5, 5000)
			EndIf
			GUICtrlSetState($ButtonSave, $GUI_DISABLE)
		Case $ButtonGet
			GUISetState(@SW_DISABLE, $hGUI)
			For $i = 1 To 5
				$iCheckGet = _GetArchivesInfo()
				If $iCheckGet Then ExitLoop
			Next
			If Not $iCheckGet Then
				_GUICtrlComboBoxEx_SetCurSel($hCombo, 0)
				_GUICtrlListView_DeleteAllItems($hListView)
				GUICtrlSetState($ButtonSave, $GUI_DISABLE)
				If $j Then
					For $i = $j To 1 Step -1
						_GUICtrlComboBoxEx_DeleteString($hCombo, 1)
					Next
				EndIf
				_ToolTipEx('Произошла ошибка получения информации об архивных файлах.', _
						Default, Default, $sTitle, 1, 5, 5000)
			EndIf
			GUICtrlSetState($Progress, $GUI_HIDE)
			GUICtrlSetState($Label, $GUI_HIDE)
			GUISetState(@SW_ENABLE, $hGUI)
			_WinAPI_EmptyWorkingSet()
		Case $ButtonSelect
			GUISetState(@SW_DISABLE, $hGUI)
			For $i = 1 To 5
				$iCheckSelect = _SelectFolder()
				If $iCheckSelect Then ExitLoop
			Next
			If Not $iCheckSelect Then
				_ToolTipEx('Произошла ошибка выбора папки.', _
						Default, Default, $sTitle, 1, 5, 5000)
			EndIf
			GUISetState(@SW_ENABLE, $hGUI)
			GUICtrlSetState($ButtonSave, $GUI_DISABLE)
		Case $ButtonSave
			For $i = 1 To 5
				$iCheckSave = _SaveInfo()
				If $iCheckSave Then ExitLoop
			Next
			If $iCheckSave Then
				_ToolTipEx('Отчет успешно сохранен в файл.' & @LF & '"' & @ScriptDir & '\' & _
						GUICtrlRead($InputSave) & '"', Default, Default, $sTitle, 1, 5, 5000)
			Else
				_ToolTipEx('Произошла ошибка сохранения отчета в файл.', _
						Default, Default, $sTitle, 1, 5, 5000)
				GUICtrlSetState($ButtonSave, $GUI_ENABLE)
			EndIf
		Case $ListView
			Switch GUICtrlGetState($ListView)
				Case 0
					_ToolTipEx('Имена архивных файлов из выбранной папки и их количество.', _
							Default, Default, $sTitle, 1, 5, 5000)
				Case 1
					_ToolTipEx('Размеры архивных файлов из выбранной папки (в килобайтах).', _
							Default, Default, $sTitle, 1, 5, 5000)
				Case 2
					_ToolTipEx('Количество файлов в архивных файлах из выбранной папки.', Default, _
							Default, $sTitle, 1, 5, 5000)

				Case 3
					_ToolTipEx('Количество папок в архивных файлах из выбранной папки.', Default, _
							Default, $sTitle, 1, 5, 5000)
				Case 4
					_ToolTipEx('Типы архивных файлов из выбранной папки.', Default, Default, _
							$sTitle, 1, 5, 5000)
			EndSwitch
	EndSwitch
WEnd

#endregion Work
;==============
#region Functions
Func _DropFolder()
	Local $bCheckColumn, $bCheckDel

	GUICtrlSetData($InputSave, '')
	For $i = 1 To 5
		$bCheckColumn = _GUICtrlListView_SetColumn($hListView, 0, 'Имена архивов', -1, 2)
		If $bCheckColumn Then ExitLoop
	Next
	If Not $bCheckColumn Then Return 0
	For $i = 1 To 5
		$bCheckDel = _GUICtrlListView_DeleteAllItems($hListView)
		If $bCheckDel Then ExitLoop
	Next
	If Not $bCheckDel Then Return 0
	_GUICtrlComboBoxEx_SetCurSel($hCombo, 0)
	If $j Then
		For $i = $j To 1 Step -1
			_GUICtrlComboBoxEx_DeleteString($hCombo, 1)
		Next
	EndIf
	If Not StringInStr(FileGetAttrib(@GUI_DragFile), 'D') Then
		_ToolTipEx('Вы выбрали файл, а не папку.', Default, Default, $sTitle, 3, 5, 5000)
		GUICtrlSetData($InputPath, '')
		GUICtrlSetTip($InputPath, 'Перетащите сюда папку с архивными' & @CRLF & _
				'файлами или кликните по кнопке справа.', $sTitle, 1, 3)
		GUICtrlSetState($ButtonGet, $GUI_DISABLE)
	Else
		GUICtrlSetTip($InputPath, @GUI_DragFile, $sTitle, 1, 3)
		GUICtrlSetState($ButtonGet, $GUI_ENABLE)
	EndIf
	Return 1

EndFunc   ;==>_DropFolder

Func _SelectFolder()
	Local $bCheckColumn, $bCheckDel, $sPath

	GUICtrlSetData($InputPath, '')
	GUICtrlSetData($InputSave, '')

	For $i = 1 To 5
		$bCheckColumn = _GUICtrlListView_SetColumn($hListView, 0, 'Имена архивов', -1, 2)
		If $bCheckColumn Then ExitLoop
	Next
	If Not $bCheckColumn Then Return 0
	For $i = 1 To 5
		$bCheckDel = _GUICtrlListView_DeleteAllItems($hListView)
		If $bCheckDel Then ExitLoop
	Next
	If Not $bCheckDel Then Return 0
	_GUICtrlComboBoxEx_SetCurSel($hCombo, 0)
	If $j Then
		For $i = $j To 1 Step -1
			_GUICtrlComboBoxEx_DeleteString($hCombo, 1)
		Next
	EndIf

	$sPath = FileSelectFolder('Укажите папку c архивными файлами', @DesktopDir & '\', 2)
	If Not @error Then
		If FileGetAttrib($sPath) <> '' Then
			GUICtrlSetData($InputPath, $sPath)
			GUICtrlSetState($ButtonGet, $GUI_ENABLE)
		Else
			GUICtrlSetState($ButtonGet, $GUI_DISABLE)
		EndIf
	Else
		GUICtrlSetState($ButtonGet, $GUI_DISABLE)
		GUICtrlSetState($ButtonSave, $GUI_DISABLE)
	EndIf
	Return 1

EndFunc   ;==>_SelectFolder

Func _ToolTipEx($sText, $iX = Default, $iY = Default, $sTitle = Default, $iIcon = Default, _
		$iOptions = Default, $iTimeOut = 0)
	AdlibUnRegister('_ToolTipCombo')
	GUICtrlSetTip($InputPath, '')
	GUICtrlSetTip($ButtonSelect, '')
	GUICtrlSetTip($ButtonGet, '')
	GUICtrlSetTip($InputSave, '')
	GUICtrlSetTip($ButtonSave, '')
	ToolTip($sText, $iX, $iY, $sTitle, $iIcon, $iOptions)

	If $iTimeOut Then
		_Timer_SetTimer(0, $iTimeOut, '_ToolTipEx_Callback')
	EndIf
EndFunc   ;==>_ToolTipEx

Func _ToolTipEx_Callback($hWnd, $Msg, $iIDTimer, $dwTime)
	Local $sInputPath
	_Timer_KillTimer($hWnd, $iIDTimer)
	ToolTip('')
	AdlibRegister('_ToolTipCombo', 50)
	$sInputPath = GUICtrlRead($InputPath)
	If $sInputPath Then
		GUICtrlSetTip($InputPath, $sInputPath, $sTitle, 1, 3)
	Else
		GUICtrlSetTip($InputPath, 'Перетащите сюда папку с архивными' & @CRLF & _
				'файлами или кликните по кнопке справа.', $sTitle, 1, 3)
	EndIf
	GUICtrlSetTip($ButtonSelect, 'Выбрать папку с архивными файлами.', $sTitle, 1, 3)
	GUICtrlSetTip($ButtonGet, 'Получить информацию об архивных файлах из выбранной папки.', $sTitle, 1, 3)
	GUICtrlSetTip($InputSave, 'Имя файла для отчета. Вы можете изменить его на любое другое.', $sTitle, 1, 3)
	GUICtrlSetTip($ButtonSave, 'Сохранить информацию об архивных файлах в файл.', $sTitle, 1, 3)

EndFunc   ;==>_ToolTipEx_Callback

Func _ToolTipCombo()
	Local $aCursor, $aWinPos, $aWinCS, $iKX = 0, $iKY = 0, $iXt, $iYt

	$aCursor = GUIGetCursorInfo()
	If Not IsArray($aCursor) Then Return
	$aWinPos = WinGetPos($hGUI)
	If Not IsArray($aWinPos) Then Return
	$aWinCS = WinGetClientSize($hGUI)
	If Not IsArray($aWinCS) Then Return
	If $aWinPos[2] > $aWinCS[0] Then
		$iKX = ($aWinPos[2] - $aWinCS[0]) / 2
	EndIf
	If $aWinPos[3] > $aWinCS[1] Then
		$iKY = $aWinPos[3] - $aWinCS[1] - $iKX
	EndIf
	$iXt = 200 + $aWinPos[0] + $iKX
	$iYt = 63 + $aWinPos[1] + $iKY
	Switch $aCursor[1]
		Case 43 To 60
			Switch $aCursor[0]
				Case 222 To 239
					GUISetCursor(0, 1)
					If $iID = 0 Then $iID = 1
					If $aCursor[2] Then
						ToolTip('', '')
						$iID = 2
					Else
						If $iID = 1 Then
							ToolTip('Выберите тип архива для сохранения в файл.', $iXt, $iYt, _
									$sTitle, 1, 3)
						EndIf
					EndIf
				Case Else
					$iID = 0
					GUISetCursor(2, 1)
					If Not $aCursor[4] Then
						ToolTip('', '')
					EndIf
			EndSwitch
		Case Else
			$iID = 0
			GUISetCursor(2, 1)
			If Not $aCursor[4] Then
				ToolTip('', '')
			EndIf
	EndSwitch
EndFunc   ;==>_ToolTipCombo

Func _No_Change_Combo()
	Local $ID_Focus = ControlGetFocus($hGUI)
	If $ID_Focus = 'Edit3' Then
		GUICtrlSetState($ButtonSelect, $GUI_FOCUS)
	EndIf
EndFunc   ;==>_No_Change_Combo

Func _WinAPI_EmptyWorkingSet($pid = 0)

	If Not $pid Then
		$pid = _WinAPI_GetCurrentProcessID()
		If Not $pid Then
			Return SetError(1, 0, 0)
		EndIf
	EndIf
	Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', 0x001F0FFF, 'int', _
			0, 'dword', $pid)
	If (@error) Or (Not $hProcess[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Local $Ret = DllCall(@SystemDir & '\psapi.dll', 'int', 'EmptyWorkingSet', 'ptr', $hProcess[0])
	If (@error) Or (Not $Ret[0]) Then
		$Ret = 0
	EndIf
	_WinAPI_CloseHandle($hProcess[0])
	If Not IsArray($Ret) Then
		Return SetError(1, 0, 0)
	EndIf
	Return 1
EndFunc   ;==>_WinAPI_EmptyWorkingSet


Func _GetArchivesInfo()
	Local $sPath, $sLog, $aList, $iPercent, $pid, $iSize, $sType, $sFile_Number, $sFolder_Number, _
			$iIndex, $sFileSave, $iLV0, $iLV1, $iLV2, $iLV3, $iLV4, $bCheckColumn, $iCB, _
			$sPathShort
	Dim $aArchives[1][6]
	Dim $aType[1][2] = [['все', 25]]
	$q = 0
	$j = 0
	$sPath = GUICtrlRead($InputPath)
	If Not $sPath Then Return 0
	GUICtrlSetState($ButtonGet, $GUI_DISABLE)
	GUICtrlSetData($Progress, '')
	GUICtrlSetData($InputSave, '')
	GUICtrlSetData($Label, '')

	$aList = _FileListToArray($sPath, '*', 1)
	If IsArray($aList) Then
		$iPercent = 100 / Number($aList[0])
		GUICtrlSetState($Progress, $GUI_SHOW)
		GUICtrlSetState($Label, $GUI_SHOW)
		For $i = 1 To $aList[0]
			$sLog = ''
			$sPathShort = FileGetShortName($sPath & '\' & $aList[$i])
			If Not StringInStr(FileGetAttrib($sPathShort), 'S') Then
				$pid = Run(@TempDir & '\7z.exe l ' & $sPathShort, '', @SW_HIDE, $STDOUT_CHILD)
				If Not $pid Then Return 0
				While 1
					$sLog &= StdoutRead($pid)
					If @error Then ExitLoop
					Sleep(10)
				WEnd
				If Not $sLog Then Return 0
				If StringInStr($sLog, 'Listing archive') Then
					$q += 1
					ReDim $aArchives[$q + 1][6]
					$iSize = FileGetSize($sPathShort)
					Switch $iSize
						Case 0 To 1024
							$iSize = $iSize & ' b'
						Case 1024 To 1048576
							$iSize = Round($iSize / 1024, 2) & ' kb'
						Case 1048577 To 1073741824
							$iSize = Round($iSize / 1048576, 2) & ' Mb'
						Case Else
							$iSize = Round($iSize / 1073741824, 2) & ' Gb'
					EndSwitch
					If Not StringLen(String($iSize)) Then Return 0
					$sType = StringRegExpReplace($sLog, '(?s).*?Type = (.*?)\r\n?.*', '\1')
					If Not StringLen(String($sType)) Then Return 0
					$sFile_Number = StringRegExpReplace($sLog, '(?s).*?\h(\d+) files?.*', '\1')
					If Not StringLen(String($sFile_Number)) Then Return 0
					$sFolder_Number = StringRegExpReplace($sLog, '(?s).*?\h(\d+) folders?.*', '\1')
					If Not StringLen(String($sFolder_Number)) Then Return 0
					$aArchives[$q][0] = $aList[$i]
					$aArchives[$q][1] = $iSize
					$aArchives[$q][2] = $sFile_Number
					$aArchives[$q][3] = $sFolder_Number
					$aArchives[$q][4] = $sType
					$iIndex = _ArraySearch($aIcons, $sType, 0, 0, 0, 0, 0, 0)
					If $iIndex = -1 Then
						$aArchives[$q][5] = 25
					Else
						$aArchives[$q][5] = $aIcons[$iIndex][1]
					EndIf
					If _ArraySearch($aType, $sType, 0, 0, 0, 0, 1, 0) = -1 Then
						$j += 1
						ReDim $aType[$j + 1][2]
						$aType[$j][0] = $sType
						If $iIndex = -1 Then
							$aType[$j][1] = 25
						Else
							$aType[$j][1] = $aIcons[$iIndex][1]
						EndIf
					EndIf
				EndIf
			EndIf
			GUICtrlSetData($Progress, $iPercent * $i)
			GUICtrlSetData($Label, 'Обработано ' & $i & ' файлов из ' & $aList[0])
			Sleep(2)
		Next
		$aArchives[0][0] = $q

		If $q Then
			$sFileSave = @MDAY & '_' & @MON & '_' & StringLeft(StringRegExpReplace($sPath, _
					'.*\\|\.*$', ''), 10) & '.txt'

			GUICtrlSetData($InputSave, $sFileSave)
			_GUICtrlListView_BeginUpdate($hListView)
			For $i = 1 To $aArchives[0][0]
				$iLV0 = _GUICtrlListView_AddItem($hListView, $aArchives[$i][0], $aArchives[$i][5])
				If $iLV0 = -1 Then Return 0
				$iLV1 = _GUICtrlListView_AddSubItem($hListView, $i - 1, $aArchives[$i][1], 1)
				If Not $iLV1 Then Return 0
				$iLV2 = _GUICtrlListView_AddSubItem($hListView, $i - 1, $aArchives[$i][2], 2)
				If Not $iLV2 Then Return 0
				$iLV3 = _GUICtrlListView_AddSubItem($hListView, $i - 1, $aArchives[$i][3], 3)
				If Not $iLV3 Then Return 0
				$iLV4 = _GUICtrlListView_AddSubItem($hListView, $i - 1, $aArchives[$i][4], 4)
				If Not $iLV4 Then Return 0
			Next
			_GUICtrlListView_EndUpdate($hListView)
			For $i = 1 To 5
				$bCheckColumn = _GUICtrlListView_SetColumn($hListView, 0, 'Имена архивов (' & _
						$aArchives[0][0] & ' файлов)', -1, 2)
				If $bCheckColumn Then ExitLoop
			Next
			If Not $bCheckColumn Then Return 0

			_GUICtrlComboBoxEx_BeginUpdate($hCombo)
			If $j Then
				For $i = 1 To $j
					$iCB = _GUICtrlComboBoxEx_AddString($hCombo, $aType[$i][0], $aType[$i][1], _
							$aType[$i][1])
					If $iCB = -1 Then Return 0
				Next
				_GUICtrlComboBoxEx_EndUpdate($hCombo)
				_GUICtrlComboBoxEx_SetCurSel($hCombo, 0)
			EndIf
			GUICtrlSetState($ButtonSave, $GUI_ENABLE)
		Else
			GUICtrlSetData($InputPath, '')
			GUICtrlSetState($ButtonSave, $GUI_DISABLE)
			_ToolTipEx('В папке' & @LF & '"' & $sPath & '"' & @LF & 'нет архивных файлов.', _
					Default, Default, $sTitle, 3, 5, 5000)
		EndIf
	Else
		GUICtrlSetData($InputPath, '')
		GUICtrlSetState($ButtonSave, $GUI_DISABLE)
		_ToolTipEx('Папка' & @LF & '"' & $sPath & '"' & @LF & 'пустая.', _
				Default, Default, $sTitle, 3, 5, 5000)
	EndIf
	Return 1

EndFunc   ;==>_GetArchivesInfo

Func _SaveInfo()
	Local $sSaveType, $iC = 0, $sFile, $iIndexType, $iCountLV, $hFileSave, $sString, $iWrite, _
			$sString0, $sString1, $sString2, $sString3, $sString4, $iIndexCombo, $iI = 0
	Local $sPath = GUICtrlRead($InputPath)
	If Not $sPath Then Return 0
	Local $sHead = @MDAY & '.' & @MON & '.' & @YEAR & '-' & @HOUR & ':' & @MIN & @CRLF & _
			'"' & $sPath & '"' & @CRLF & '№.  Имя файла;  Размер; Файлов; Папок; Тип' & @CRLF & _
			'==========================================' & @CRLF
	$sFile = GUICtrlRead($InputSave)
	If $sFile Then
		If StringRight($sFile, 4) <> '.txt' Then
			$sFile = StringLeft(StringRegExpReplace($sFile, '.*\\|\.[^.]*$', ''), 10) & '.txt'
		EndIf
	Else
		$sFile = @MDAY & '_' & @MON & '.txt'
	EndIf
	If FileExists(@ScriptDir & '\' & $sFile) Then
		$iC += 1
		$sFile = $iC & '-' & StringRegExpReplace($sFile, '^.*\-', '')
		While 1
			If Not FileExists(@ScriptDir & '\' & $sFile) Then ExitLoop
			$iC += 1
			$sFile = $iC & '-' & StringRegExpReplace($sFile, '^.*\-', '')
			Sleep(2)
		WEnd
	EndIf
	GUICtrlSetData($InputSave, $sFile)
	$sFile = @ScriptDir & '\' & $sFile
	For $i = 1 To 5
		$iIndexType = _GUICtrlComboBox_GetCurSel($hCombo)
		If $iIndexType <> -1 Then ExitLoop
	Next
	If $iIndexType = -1 Then Return 0
	For $i = 1 To 5
		$iCountLV = _GUICtrlListView_GetItemCount($hListView)
		If $iCountLV Then ExitLoop
	Next
	If Not $iCountLV Then Return 0

	For $i = 1 To 5
		$hFileSave = FileOpen($sFile, 2)
		If $hFileSave <> -1 Then ExitLoop
	Next
	If $hFileSave = -1 Then Return 0
	For $i = 1 To 5
		$iWrite = FileWrite($hFileSave, $sHead)
		If $iWrite Then ExitLoop
	Next
	If Not $iWrite Then Return 0

	Switch $iIndexType
		Case 0
			For $i = 0 To $iCountLV - 1
				For $y = 1 To 5
					$sString0 = _GUICtrlListView_GetItemText($hListView, $i)
					If $sString0 Then ExitLoop
				Next
				If Not $sString0 Then Return 0
				For $y = 1 To 5
					$sString1 = _GUICtrlListView_GetItemText($hListView, $i, 1)
					If $sString1 Then ExitLoop
				Next
				If Not $sString1 Then Return 0
				For $y = 1 To 5
					$sString2 = _GUICtrlListView_GetItemText($hListView, $i, 2)
					If $sString2 Then ExitLoop
				Next
				If Not $sString2 Then Return 0
				For $y = 1 To 5
					$sString3 = _GUICtrlListView_GetItemText($hListView, $i, 3)
					If $sString3 Then ExitLoop
				Next
				If Not $sString3 Then Return 0
				For $y = 1 To 5
					$sString4 = _GUICtrlListView_GetItemText($hListView, $i, 4)
					If $sString4 Then ExitLoop
				Next
				If Not $sString4 Then Return 0
				$iI += 1
				$sString = $iI & '.  ' & $sString0 & ';  ' & $sString1 & ';  ' & $sString2 & ';  ' & _
						$sString3 & ';  ' & $sString4
				For $y = 1 To 5
					$iWrite = FileWriteLine($hFileSave, $sString)
					If $iWrite Then ExitLoop
				Next
				If Not $iWrite Then Return 0
			Next
		Case Else
			For $i = 1 To 5
				$iIndexCombo = _GUICtrlComboBoxEx_GetItemText($hCombo, $iIndexType, $sSaveType)
				If $iIndexCombo <> -1 Then ExitLoop
			Next
			If $iIndexCombo = -1 Then Return 0
			For $i = 0 To $iCountLV - 1
				For $y = 1 To 5
					$sString4 = _GUICtrlListView_GetItemText($hListView, $i, 4)
					If $sString4 Then ExitLoop
				Next
				If Not $sString4 Then Return 0
				If $sString4 = $sSaveType Then
					For $y = 1 To 5
						$sString0 = _GUICtrlListView_GetItemText($hListView, $i)
						If $sString0 Then ExitLoop
					Next
					If Not $sString0 Then Return 0
					For $y = 1 To 5
						$sString1 = _GUICtrlListView_GetItemText($hListView, $i, 1)
						If $sString1 Then ExitLoop
					Next
					If Not $sString1 Then Return 0
					For $y = 1 To 5
						$sString2 = _GUICtrlListView_GetItemText($hListView, $i, 2)
						If $sString2 Then ExitLoop
					Next
					If Not $sString2 Then Return 0
					For $y = 1 To 5
						$sString3 = _GUICtrlListView_GetItemText($hListView, $i, 3)
						If $sString3 Then ExitLoop
					Next
					If Not $sString3 Then Return 0
					$iI += 1
					$sString = $iI & '.  ' & $sString0 & ';  ' & $sString1 & ';  ' & $sString2 & ';  ' & _
							$sString3 & ';  ' & $sString4
					For $y = 1 To 5
						$iWrite = FileWriteLine($hFileSave, $sString)
						If $iWrite Then ExitLoop
					Next
					If Not $iWrite Then Return 0
				EndIf
			Next
	EndSwitch
	FileClose($hFileSave)

	Return 1
EndFunc   ;==>_SaveInfo

#endregion Functions
В архиве консольный 7z.exe, Icons.icl - файл с иконками, 1_Icon.ico - иконка, 7z.dll - нужна для работы 7z.exe. Их надо положить в папку со скриптом. Лежит здесь и здесь.
У меня работает (Windows XP SP3). Будут косяки - будем исправлять. :smile:
 
Автор
F

Freesty1er

Новичок
Сообщения
7
Репутация
0
Кхм. Почему-то как указываю папку или пытаюсь перетянуть файлы в скрипт, пишет что в папке нету архивных файлов. :wacko:
XP SP3

Установил 7-zip - заработало!
Спасибо!!! Сегодня буду тестировать, отпишусь.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Freesty1er [?]
Установил 7-zip - заработало!
Каюсь, мой косяк. Я не проверил работу скрипта на системе с неустановленным 7zip. Консольный 7z.exe использует 7z.dll (лежит здесь и здесь, надо положить рядом со скриптом). Я код поправил, проверил, у меня работает на Windows XP SP3-32, Windows 7-32 и Windows 7-64 без установленного 7-zip.
Может добавить опцию выбора архивов для анализа по расширению и возможность искать архивные файлы не только в самой папке, но и во вложенных поддиректориях?
 
Автор
F

Freesty1er

Новичок
Сообщения
7
Репутация
0
madmasles сказал(а):
Может добавить опцию выбора архивов для анализа по расширению и возможность искать архивные файлы не только в самой папке, но и во вложенных поддиректориях?
Так ведь опция выбора архивов для анализа по расширению уже есть :thumbs_up:
Большое спасибо! :IL_AutoIt_1: Думаю, поиск во вложенных поддиректориях будет лишний :smile: Если можно сделать его чекбоксом, тогда не помешало бы. Но это не обязательно :ok:

Всё кажется работает нормально, вот только вместо "Kb" показывает "b", а вместо "Mb" -> "Kb". В предыдущей версии такого не было.

Еще раз БОЛЬШОЕ СПАСИБО! :beer:

Кстати, для того что бы изменить путь назначения файла в определенную папку, нужно изменить в 3х местах "(@ScriptDir & '\' & $sFile)" на "('D:\info\' & '\' & $sFile)"?
$sFile = GUICtrlRead($InputSave)
If $sFile Then
If StringRight($sFile, 4) <> '.txt' Then
$sFile = StringLeft(StringRegExpReplace($sFile, '.*\\|\.[^.]*$', ''), 10) & '.txt'
EndIf
Else
$sFile = @MDAY & '_' & @MON & '.txt'
EndIf
If FileExists(@ScriptDir & '\' & $sFile) Then
$iC += 1
$sFile = $iC & '-' & StringRegExpReplace($sFile, '^.*\-', '')
While 1
If Not FileExists(@ScriptDir & '\' & $sFile) Then ExitLoop
$iC += 1
$sFile = $iC & '-' & StringRegExpReplace($sFile, '^.*\-', '')
Sleep(2)
WEnd
EndIf
GUICtrlSetData($InputSave, $sFile)
$sFile = @ScriptDir & '\' & $sFile
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Freesty1er [?]
только вместо "Kb" показывает "b", а вместо "Mb" -> "Kb"
Исправил.
Так ведь опция выбора архивов для анализа по расширению уже есть
Это опция по сохранению информации в файл, анализирует он все архивы, которые есть.
 
Верх