#include <WinAPIEx.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <Misc.au3>
#include <Constants.au3>
Opt('TrayMenuMode', 1)
Global $sTitle = 'Test', $iSizeAll = 0, $sExt = '*.au3', _;'*.sds';поменяйте, когда будете проверять.
$iCountDirs = 0
Dim $aSearch_Dirs[$iCountDirs + 1]
_Singleton(@ScriptName)
$hGui = GUICreate($sTitle, 600, 335, -1, -1, -1, BitOR($WS_EX_ACCEPTFILES, $WS_EX_TOPMOST))
GUISetBkColor(0xE0FFFF)
$nInputPath = GUICtrlCreateInput('Перетащите сюда папку или кликните по кнопке справа.', 5, 11, 560, _
18, $ES_READONLY, BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetTip(-1, 'Перетащите сюда папку или кликните по кнопке справа.')
$nButtonPath = GUICtrlCreateButton('...', 570, 10, 25, 20)
$nCheckAll = GUICtrlCreateCheckbox('Снять все', 5, 35, 80, 20)
GUICtrlSetState(-1, BitOR($GUI_CHECKED, $GUI_DISABLE))
$nButtonSearch = GUICtrlCreateButton('Найти', 100, 35, 100, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, 'Найти файлы в выбранной папке')
$nButtonDelAll = GUICtrlCreateButton('Удалить все', 210, 35, 100, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, 'Удалить все файлы из списка.')
For $i = $nButtonPath To $nButtonDelAll
GUICtrlSetCursor($i, 0)
Next
$nListview = GUICtrlCreateListView('', 5, 60, 590, 235, $GUI_SS_DEFAULT_LISTVIEW, _
BitOR($WS_EX_CLIENTEDGE, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetTip(-1, 'Перетащите сюда файлы для обработки.')
$hListView = GUICtrlGetHandle($nListview)
_GUICtrlListView_AddColumn($hListView, 'Имя файла', 100)
_GUICtrlListView_AddColumn($hListView, 'Путь к папке обработки', 380)
_GUICtrlListView_AddColumn($hListView, 'Размер файлов', 100)
$nProgress = GUICtrlCreateProgress(5, 305, 590, 20)
GUISetState()
_WinAPI_EmptyWorkingSet()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_DROPPED
If @GUI_DropId = $nInputPath Then
GUICtrlSetData($nInputPath, '')
If _WinAPI_PathIsDirectory(@GUI_DragFile) Then
GUICtrlSetData($nInputPath, @GUI_DragFile)
GUICtrlSetTip($nInputPath, @GUI_DragFile)
GUICtrlSetState($nButtonSearch, $GUI_ENABLE)
Else
GUICtrlSetData($nInputPath, 'Нужно выбрать папку.')
GUICtrlSetTip($nInputPath, 'Перетащите сюда папку или кликните по кнопке справа.')
GUICtrlSetState($nButtonSearch, $GUI_DISABLE)
EndIf
ElseIf @GUI_DropId = $nListview Then
_DragFile_ListView(@GUI_DragFile)
EndIf
Case $nCheckAll
If GUICtrlRead($nCheckAll) == $GUI_CHECKED Then
GUICtrlSetData($nCheckAll, 'Снять все')
_GUICtrlListView_SetItemChecked($hListView, -1)
Else
GUICtrlSetData($nCheckAll, 'Выбрать все')
_GUICtrlListView_SetItemChecked($hListView, -1, False)
EndIf
Case $nButtonDelAll
_GUICtrlListView_DeleteAllItems($hListView)
_GUICtrlListView_SetColumn($hListView, 0, 'Имя файла')
_GUICtrlListView_SetColumn($hListView, 2, 'Размер файлов')
GUICtrlSetState($nButtonDelAll, $GUI_DISABLE)
GUICtrlSetState($nCheckAll, BitOR($GUI_CHECKED, $GUI_DISABLE))
GUICtrlSetData($nProgress, 0)
GUICtrlSetData($nCheckAll, 'Снять все')
GUICtrlSetData($nInputPath, 'Перетащите сюда папку или кликните по кнопке справа.')
GUICtrlSetTip($nInputPath, 'Перетащите сюда папку или кликните по кнопке справа.')
$iSizeAll = 0
$iCountDirs = 0
ReDim $aSearch_Dirs[$iCountDirs + 1]
Case $nButtonSearch
_Array_To_ListView()
Case $nButtonPath
_Get_Folder()
EndSwitch
WEnd
Func _Array_To_ListView()
Local $a_Files, $a_ToListView[1][3], $i_Size, $i_Index, $s_Path
GUICtrlSetData($nProgress, 0)
$s_Path = GUICtrlRead($nInputPath)
If _ArraySearch($aSearch_Dirs, $s_Path) <> -1 Then
GUICtrlSetData($nInputPath, 'В этой папке уже искали файлы.')
GUICtrlSetState($nButtonSearch, $GUI_DISABLE)
Return
Else
$iCountDirs += 1
ReDim $aSearch_Dirs[$iCountDirs + 1]
$aSearch_Dirs[$iCountDirs] = $s_Path
$aSearch_Dirs[0] = $iCountDirs
EndIf
GUISetState(@SW_DISABLE)
$a_Files = _FileSearch($s_Path, $sExt, 1)
If $a_Files[0] Then
ReDim $a_ToListView[$a_Files[0]][3]
For $i = 1 To $a_Files[0]
$a_ToListView[$i - 1][0] = _WinAPI_PathStripPath($a_Files[$i])
$a_ToListView[$i - 1][1] = _WinAPI_PathRemoveExtension($a_Files[$i])
$i_Size = FileGetSize($a_Files[$i])
$a_ToListView[$i - 1][2] = _GetSize($i_Size)
$iSizeAll += $i_Size
GUICtrlSetData($nProgress, (100 / $a_Files[0]) * $i)
Next
_GUICtrlListView_AddArray($hListView, $a_ToListView)
$i_Index = _GUICtrlListView_GetItemCount($hListView)
_GUICtrlListView_SetColumn($hListView, 0, 'Имя файла (' & $i_Index & ')')
_GUICtrlListView_SetColumn($hListView, 2, 'Всего: ' & _GetSize($iSizeAll))
_GUICtrlListView_SetItemChecked($hListView, -1)
GUICtrlSetState($nCheckAll, $GUI_ENABLE)
GUICtrlSetState($nButtonDelAll, $GUI_ENABLE)
Else
GUICtrlSetData($nInputPath, 'В этой папке нет нужных файлов.')
GUICtrlSetTip($nInputPath, 'Перетащите сюда папку или кликните по кнопке справа.')
EndIf
GUICtrlSetState($nButtonSearch, $GUI_DISABLE)
GUISetState(@SW_ENABLE)
EndFunc ;==>_Array_To_ListView
Func _DragFile_ListView($s_Path)
Local $i_Index, $i_Size, $s_File
If _WinAPI_PathMatchSpec($s_Path, $sExt) Then
$i_Index = _GUICtrlListView_GetItemCount($hListView)
$s_File = _WinAPI_PathStripPath($s_Path)
For $i = 0 To $i_Index - 1
If _GUICtrlListView_GetItemText($hListView, $i) == $s_File Then Return
Next
$i_Size = FileGetSize($s_Path)
$iSizeAll += $i_Size
_GUICtrlListView_AddItem($hListView, $s_File)
_GUICtrlListView_AddSubItem($hListView, $i_Index, _WinAPI_PathRemoveExtension($s_Path), 1)
_GUICtrlListView_AddSubItem($hListView, $i_Index, _GetSize($i_Size), 2)
_GUICtrlListView_SetColumn($hListView, 0, 'Имя файла (' & $i_Index + 1 & ')')
_GUICtrlListView_SetColumn($hListView, 2, 'Всего: ' & _GetSize($iSizeAll))
_GUICtrlListView_SetItemChecked($hListView, $i_Index)
GUICtrlSetState($nCheckAll, $GUI_ENABLE)
GUICtrlSetState($nButtonDelAll, $GUI_ENABLE)
EndIf
EndFunc ;==>_DragFile_ListView
Func _GetSize($i_Size)
Local $sReturnString = ''
If Number($i_Size) < 0 Then Return $sReturnString
Switch Number($i_Size)
Case 0 To 1023
$sReturnString = StringFormat('%.2f b', $i_Size)
Return $sReturnString
Case 1024 To 1048575
$sReturnString = StringFormat('%.2f kb', $i_Size / 1024)
Return $sReturnString
Case 1048576 To 1073741823
$sReturnString = StringFormat('%.2f Mb', $i_Size / (1024 * 1024))
Return $sReturnString
Case Else
$sReturnString = StringFormat('%.2f Gb', $i_Size / (1024 * 1024 * 1024))
Return $sReturnString
EndSwitch
EndFunc ;==>_GetSize
Func _FileSearch($sPath, $sFileMask = '*', $iFlag = 0, $iSubdir = 1)
;фильтры для поиска нужно указывать через ;
;$iFlag = 0 - Файлы и папки (по умолчанию)
;$iFlag = 1 - Только файлы
;$iFlag = 2 - Только папки
;$iSubdir = 1 - Искать во всех подкаталогах (по умолчанию)
;$iSubdir = 0 - Искать только в самой папке
Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sSubdir, $aMasks
If StringRight($sPath, 1) == '\' Then
$sPath = StringTrimRight($sPath, 1)
EndIf
If $iSubdir Then
$sSubdir = ' /S /B'
Else
$sSubdir = ' /B'
EndIf
Switch $iFlag
Case 1
$sAttrib = ' /A-D'
Case 2
$sAttrib = ' /AD'
Case Else
$sAttrib = ' /A'
EndSwitch
$sOut = StringToBinary('0' & @CRLF, 2)
$aMasks = StringSplit($sFileMask, ';')
For $i = 1 To $aMasks[0]
$hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '"' & $sSubdir & $sAttrib, @SystemDir, @SW_HIDE, 6)
While 1
$sRead = StdoutRead($hDir, False, True)
If @error Then
ExitLoop
EndIf
If $sRead <> "" Then
$sOut &= $sRead
EndIf
WEnd
Next
$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
If @error Then
Return SetError(1)
EndIf
$aOut[0] = UBound($aOut) - 1
Return $aOut
EndFunc ;==>_FileSearch
Func _Get_Folder()
Local $s_Message = 'Выберите папку в которой будем искать файлы.'
GUICtrlSetData($nInputPath, '')
WinSetOnTop($hGui, '', 0)
Local $sNewFolder = FileSelectFolder($s_Message, '', 6)
If @error Or Not $sNewFolder Or (Not _WinAPI_PathIsDirectory($sNewFolder)) Then
WinSetOnTop($hGui, '', 1)
GUICtrlSetData($nInputPath, 'Нужно выбрать папку.')
GUICtrlSetTip($nInputPath, 'Перетащите сюда папку или кликните по кнопке справа.')
GUICtrlSetState($nButtonSearch, $GUI_DISABLE)
Return
EndIf
GUICtrlSetData($nInputPath, $sNewFolder)
GUICtrlSetTip($nInputPath, $sNewFolder)
GUICtrlSetState($nButtonSearch, $GUI_ENABLE)
WinSetOnTop($hGui, '', 1)
Return
EndFunc ;==>_Get_Folder