Что нового

[Файловая система] Проверка размера папки

Malderin

Новичок
Сообщения
68
Репутация
1
AutoIt: 3.3.12.0
Версия: 1.0

Категория: Файловая система

Описание: Есть необходимость администрирования сетевой папки в локальной сети. Структура сетевой папки проста. Внутри нее содержатся именные папки по фамилиям работников нашей организации. Задача проста. Периодически (запуская вручную данный скрипт) выявить, в какой из именных папок изменился размер. Поскольку корневая папки имеет ограниченную квоту на размер, важно понимать кто из пользователей сожрал слишком много места.
На самом деле найти применение данного скрипта можно и на локальном ПК. Скрипт дает возможность выбрать любую папку для проверки в любом месте (на ПК или в локальной сети значения не имеет).
Принцип работы программы.
При первом запуске выбираем папку для проверки. Создается лог файл, в нем сохраняется путь к выбранной папке, чтобы при следующем запуске заново не выбирать. В папке со скриптом создается папка с названием выбранной папки. Внутри нее после отработки скрипта (по GUI кнопке проверки размера папки) будут созданы файлы .log и .xls с результатами. Лог файл носит факультативный характер (так для информации), а файл xls сделан как основной. Данный вставляются в три столбца. Второй и третий столбцы – путь к проверяемой подпапке и ее размер. Первый столбец – разница между размером папки при предыдущей проверке и при текущей (дельта). Разумеется разница считается при второй и последующих проверках, при первом запуске разница равна текущему размеру подпапки.
Для работы требуется библиотека FileOperations.au3 (во вложении).

Код/Пример:
Код:
#Include <FileOperations.au3>
#include <Array.au3>
#Include <FileOperations.au3>
#include <Excel.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <ProgressConstants.au3>

$Path1 = @ScriptDir&"\script.log" ;Путь к файлу ini
$Path_904 = IniRead($Path1, "Path", "Value", "Путь не выбран")
If $Path_904 = "Путь не выбран" Then
   IniWrite($Path1, "Path", "Value", "Путь не выбран")
EndIf

$hGui = GUICreate("Проверка размера папки", 450, 180, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
$path_11 = GUICtrlCreateLabel("Текущая папка для проверки: ", 10, 10, 150)
$iButton = GUICtrlCreateButton("Изменить", 10, 49, 85, 20)
$start = GUICtrlCreateButton("Начать проверку размера папки", 10, 80, 300, 40, $BS_DEFPUSHBUTTON)
$xlsopen = GUICtrlCreateButton("Открыть в Excel", 315, 80, 130, 40, $BS_DEFPUSHBUTTON)
GUICtrlSetState($xlsopen, $GUI_DISABLE)
$prog2 = GUICtrlCreateLabel($Path_904, 10, 25, 425)
$progres = GUICtrlCreateLabel(".........", 10, 125, 425, 26)
$progressbar2 = GUICtrlCreateProgress(5, 155, 440, 20)
GUICtrlSetColor(-1, 32250)
GUISetState(@SW_SHOW)

 While 1
        Switch GUIGetMsg()
			Case $iButton
			   $Path_904 = FileSelectFolder('Выберите папку', '', 3, @ScriptDir, $hGui)
			   $Dir_Name = ".*\\(.*)"
			   $F_Name = "_" & StringRegExpReplace($Path_904, $Dir_Name, "$1")
			   DirCreate ( @ScriptDir & "\" & $F_Name)
			   $path2 = @ScriptDir & "\" & $F_Name & "\" & $F_Name & ".log"
				IniWrite($path2, "path", "Value", $Path_904)
				IniWrite($path1, "path", "Value", $Path_904)
				MsgBox(4096, 'Выбрана папка', $Path_904)
					GUICtrlSetState($prog2, $GUI_HIDE)
					GUICtrlSetData($prog2, $Path_904)
					GUICtrlSetState($prog2, $GUI_SHOW)
				GUICtrlSetTip ($prog2, $Path_904)
			Case $start
			   Disable()
			   Razmer ()
			   Enable()
			Case $xlsopen
			   $Dir_Name = ".*\\(.*)"
			   $F_Name = "_" & StringRegExpReplace($Path_904, $Dir_Name, "$1")
			   $oExcel = _ExcelBookOpen(@ScriptDir & "\" & $F_Name & "\" & $F_Name & ".xls")
			Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
   WEnd
   GUIDelete()

Func Razmer()
$Date = StringFormat("%04d.%02d.%02d %02d:%02d:%02d", @YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC)
$hTimer = TimerInit()
$res = DirGetSize($path_904, 1)
$iDiff = Round(TimerDiff($hTimer) / 1000, 2) ; время в секундах
$size = Round($res[0]/1024/1024, 2)
$size1 = $size
Global $Folder = _FO_FolderSearch($Path_904, '', True, 0)
$j = (100/$Folder[0])

If @error = 3 Then
   MsgBox(4096, "Завершено", "Вложенные папки отстутсвуют")
   Exit
EndIf

$Dir_Name = ".*\\(.*)"
$F_Name = "_" & StringRegExpReplace($Path_904, $Dir_Name, "$1")
$path2 = @ScriptDir & "\" & $F_Name & "\" & $F_Name & ".log"
;~ ConsoleWrite($path2 & @LF)
;~ Sleep(3000)
IniWriteSection($path2, $path_904 & "; " & $Date, "Общий размер =" & $size & " Мб")
$oExcel = _ExcelBookOpen(@ScriptDir & "\" & $F_Name & "\" & $F_Name & ".xls",0)

If @error Then
   MsgBox(4096, "Ошибка", "Файл " & $F_Name & "\" & $F_Name & ".xls" & " не существует, создан новый файл")
   $Excel = _ExcelBookNew(0)
   _ExcelBookSaveAs($Excel, @ScriptDir & "\" & $F_Name & "\" & $F_Name)
   _ExcelBookClose($Excel)
   $oExcel = _ExcelBookOpen(@ScriptDir & "\" & $F_Name & "\" & $F_Name & ".xls",0)
EndIf

_ExcelColumnInsert($oExcel, 1 , 3)
_ExcelWriteCell($oExcel, "Дата проверки: " & $Date, 1, 1)
_ExcelWriteCell($oExcel, "Общий размер =" & $size & " Мб", 1, 2)
_ExcelColumnInsert($oExcel, 1 , 1)
_ExcelWriteCell($oExcel, "Дельта (Мб)", 1, 1)

For $i=1 To $Folder[0]
;~ ConsoleWrite($Folder[$i] & @LF)
   $dirsize = DirGetSize($Folder[$i], 1)
   $size = Round($dirsize[0]/1024/1024, 2)
   IniWrite($path2, $path_904 & "; " & $Date, $Folder[$i], $size)
   _ExcelWriteCell($oExcel, $Folder[$i], $i+2, 2)
   _ExcelWriteCell($oExcel, $size, $i+2, 3)
   _ExcelWriteCell($oExcel, "=C" & $i+2 & "-G" & $i+2, $i+2, 1)
	  GUICtrlSetState($progres, $GUI_HIDE)
	  GUICtrlSetData($progres, "Обработка: " & $Folder[$i])
	  GUICtrlSetState($progres, $GUI_SHOW)
	  GUICtrlSetData($progressbar2, ($i*$j))
Next

Excel_($oExcel)

	  GUICtrlSetState($progres, $GUI_HIDE)
	  GUICtrlSetData($progres, "Обработано папок: " & $Folder[0])
	  GUICtrlSetState($progres, $GUI_SHOW)
IniWrite($path2, $path_904 & "; " & $Date, "======== end of statistic", " =========")

_ExcelBookSave($oExcel)
_ExcelBookClose($oExcel, 0, 1)

If IsArray($res) Then
    MsgBox(4096, "Результат", _
            "Размер (Mб): " & $size1 & @LF & _
            "Файлов(всего): " & $res[1] & @LF & _
            "Каталогов(всего): " & $res[2] & @LF & _
            "Время выполнения (сек): " & $iDiff)
EndIf
EndFunc

Func Disable()
GUICtrlSetState($iButton, $GUI_DISABLE)
GUICtrlSetState($start, $GUI_DISABLE)
GUICtrlSetState($xlsopen, $GUI_DISABLE)
EndFunc

Func Enable()
GUICtrlSetState($iButton, $GUI_ENABLE)
GUICtrlSetState($start, $GUI_ENABLE)
GUICtrlSetState($xlsopen, $GUI_ENABLE)
EndFunc

Func Excel_($oExcel)

Global $oRange = $oExcel.Application.Sheets(1).Range('A1:C1')
With $oRange
   .ColumnWidth = 14 ;ширина столбца
   .Font.Bold = True ;жирный шрифт
EndWith

$oExcel.Application.Sheets(1).Range('B1').ColumnWidth = 45

$oRange = $oExcel.Application.Sheets(1).Range('A1:C' & $Folder[0]+2)
With $oRange
   .WrapText = True ;Автоперенос в ячейке
   .HorizontalAlignment = $xlCenter ;расположение по горизонтали
   .VerticalAlignment = $xlCenter ;по вертикали
EndWith

$oExcel.Application.Sheets(1).Range('B3:B' & $Folder[0]+2).HorizontalAlignment = $xlLeft

For $i = 7 To 12
    With $oRange.Borders($i)
        .LineStyle = 1 ;стиль линии
;~         .Weight = -4138 ;толщина линии
;~         .ColorIndex = 5 ; цвет линии(1 - 56)
    EndWith
Next

For $i = 7 To 10
    With $oRange.Borders($i)
        .Weight = -4138 ;толщина линии
    EndWith
Next

$oRange = $oExcel.Application.Sheets(1).Range('A1:C1')
For $i = 7 To 12
    With $oRange.Borders($i)
        .Weight = -4138 ;толщина линии
    EndWith
Next
EndFunc

Источник: autoit-script.ru
Автор(ы): Malderin
 

Вложения

  • FileOperations.rar
    7 КБ · Просмотры: 21

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Скрипт нерабочий. Откуда взяты функции работы с excel ?
в 3.3.12.0 их нет
Библиотека FileOperations.au3 не входит в стандартный набор, стоит ее здесь прикрепить.
Ещё минус кода - большинство переменных не объявлены (Local, Global)
 
Автор
M

Malderin

Новичок
Сообщения
68
Репутация
1
joiner сказал(а):
Откуда взяты функции работы с excel ? в 3.3.12.0 их нет
Функции для создания/наполнения таблицы ексель взяты из Excel.au3. Функции изменения размеров столбцов, линий, шрифтов и т.п. взяты как дополнение отсюда: https://msdn.microsoft.com/en-us/library/office/ff194068.aspx
т.к. в стандартных средствах AutoIt я ничего подобного не нашёл (может плохо искал):


joiner сказал(а):
Ещё минус кода - большинство переменных не объявлены (Local, Global)
Знаю что это может быть не совсем правильно, но я привык объявлять переменные только когда это необходимо, по этому я объявил только пару глобальных переменных, которые этого требовали. Конечно надо отвыкать от этой дурной привычки.

joiner сказал(а):
Библиотека FileOperations.au3 не входит в стандартный набор
Настолько давно использую ее, что уже и забыл что она не входит в комплект поставки, прикреплю в первое сообщение.
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
OffTopic:
На правах комментария.
На работе тоже делал такое, только на Powershell.
Как пишет сам автор "Периодически (запуская вручную данный скрипт) выявить" - это можно сделать в файловых менеджерах.
Почему программы пишут для людей? Программы надо писать чтобы меньше работать, в этом смысл.
Посыл: нужно мониторить место.
Программа мониторит (автозапуск, без гуй, пишет в базу(txt,csv,sql)), при превышении как-то сигнализирует.
Если нужен визуал, можно сделать запуск с ключем.
Все.
 
Верх