Что нового

Проверка файлов на изменение рамера

in-com

Новичок
Сообщения
28
Репутация
0
Собственно проблема такова:
В папке имеется несколько файлов и папок. Необходимо сделать проверку (скрытно) всех файлов в папке и подпапках на изменение их размера (файлов) и если размер какого-нибудь файла изменился, то скрипт выдавал бы сообщение об изменившемся файле. Т.е. проверяемые файлы и их оригинальный размер должны быть прописаны в самом скрипте или ini файле.
Я долго мучался над этим, так и не понял, как это реализовать. Надеюсь на вашу помощь.
 

Arei

Скриптер
Сообщения
938
Репутация
115
Re: Проверка и удаление файлов

НА форуме есть ответы на ваши вопросы.Если к вечеру не будет ответа, то я вам всё найду.
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Re: Проверка и удаление файлов

Кто-нибудь мне поможет?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Проверка и удаление файлов

in-com [?]
Что-то я не нашел подходящие

Наверное плохо искал .
Если взять за основу : Поиск файлов на диске

то получится что-то подобное этому :
Код:
#include<GuiConstantsEx.au3>
#Include <File.au3>
#Include <Array.au3>

Global $s__NoDeleteFiles="|1.txt|3.txt|" ; Неудаляемые файлы
Global $s__Text = "",$s__DefoultText
Global $s__FilesForDelete=''


$hGUI = GUICreate("Test",200,100)
$btSearch = GUICtrlCreateButton("Search", 10, 60, 60, 30)
$btExit = GUICtrlCreateButton("Exit", 130, 60, 60, 30)

GUISetState()
While 1
	Local $TagString_HEX
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $btExit
			Exit
		Case $btSearch
			$s__Text = ""
			$s__FilesForDelete=''
			_FindFiles('C:\Temp', '*.*')
			If $s__FilesForDelete="" Then $s__FilesForDelete="Отсутствуют !"
			MsgBox(4,'Файлы для удаления :',"Удалить файлы :? " & @CRLF & @CRLF & $s__FilesForDelete )
			$s__DefoultText=$s__Text
	EndSwitch
WEnd

Func _FindFiles($sRoot, $sPattern)
    Local $FileList
    $FileList = _FileListToArray($sRoot, $sPattern, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            $iFileSize=FileGetSize($sRoot & '\' & $FileList[$i])
			$iDefFileSize=StringRegExpReplace($s__DefoultText,"(?s).+\Q" & $sRoot & '\' & $FileList[$i] & "\E\|(\d+).+","\1")
			If @extended=0 Then $iDefFileSize=''
			If $iFileSize <> $iDefFileSize  And $iDefFileSize<>"" Then ; Проверка изменения размера
				GetFilesForDelete($sRoot)
				ExitLoop
			EndIf
			$s__Text &= $sRoot & '\' & $FileList[$i] & "|" & $iFileSize & @CRLF
        Next
    EndIf
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sPattern)
        Next
    EndIf
EndFunc   ;==>_FindFiles

Func GetFilesForDelete($sPath)
	$aFileList = _FileListToArray($sPath, "*.*", 1)
	For $i=1 To UBound($aFileList) -1
		If StringRegExp ( $s__NoDeleteFiles, "\|" & $aFileList[$i] & "\|",0) Then ContinueLoop ; Отбросить неудаляемые файлы
		$s__FilesForDelete &=$sPath & "\" & $aFileList[$i] & @CRLF
	Next
EndFunc

Там уже можно добавить само удаление файлов
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Re: Проверка и удаление файлов

gregaz сказал(а):
само удаление файлов
Ok, удаление файлов уже не нужно.

Необходимо, чтобы скрипт проверял файлы (указанные в скрипте) на изменение размера или по сумме MD5 (прописанные так-же в скрипте) и, если хоть 1 файл изменился то скрипт выдавал бы сообщение об изменившемся файле с указанием (в сообщении) какой файл изменился и дальнейшее выполнение действия (запуска определенной программы) было бы невозможным, но если размер или контрольные суммы совпадают с проверяемыми файлами, то скрипт продолжал бы выполнение действия (запуска определенной программы)
Если у кого есть такой скрипт, поделитесь :beer:
Я просто не силен в AutoIt и не представляю, как это сделать :(
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Проверка и удаление файлов

in-com [?]
как это сделать

Можно так :
Код:
#include<GuiConstantsEx.au3>

$hGUI = GUICreate("Test",200,100)
$btCheck = GUICtrlCreateButton("Check ", 10, 60, 60, 30)
$btExit = GUICtrlCreateButton("Exit", 130, 60, 60, 30)
$hStatus= GUICtrlCreateLabel("", 10, 10, 180, 20, 0x1000)

$sVar = FileOpenDialog("Select Files", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "(*.txt)", 5)
$aVar=StringSplit($sVar,"|"); Массив контролируемых файлов

$sCheckedText=CheckFiles($aVar)
$sDefoult=$sCheckedText
ConsoleWrite($sCheckedText & @LF)

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $btExit
            Exit
        Case $btCheck
			$sCheckedText=CheckFiles($aVar,$sDefoult)
			If $sCheckedText=$sDefoult  Then
				GUICtrlSetData($hStatus,"FileSizes = Const")
			Else	
				GUICtrlSetData($hStatus,"FileSizes = Var")
				MsgBox(0,'Внимание !!!','Размер файла : ' & @CRLF & $sCheckedText & "изменился.")
				;ContinueLoop
				Exit
			EndIf
			$sDefoult=$sCheckedText
			; ******** Здесь возможный запуск какой-то программы
			; ShellExecute(******.***) или Run(******.***)
	EndSwitch
WEnd

Func CheckFiles($aFiles,$sDef='')
	Local $sText 
	For $i=2 To UBound($aFiles)-1
		$iFileSize=FileGetSize($aFiles[1] & '\' & $aFiles[$i])
		$sDef=StringReplace($sDef,$aFiles[1] & '\' & $aFiles[$i] & "|" & $iFileSize & @CRLF,"")
		$sText &=$aFiles[1] & '\' & $aFiles[$i] & "|" & $iFileSize & @CRLF
	Next	
	If $sDef <> "" Then Return $sDef
	Return $sText
EndFunc
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Re: Проверка и удаление файлов

сделать проверку всех файлов в папке и подпапках на изменение их размера
Наверное, (мне так кажется) сделать проверку на размер можно путем сравнивания чего-то с чем-то.
Мне так кажется, что при первом запуске скрипта программа (скрипт)
должна сначала записать в некую свою базу (или файл) все эти значения для сравнения.
При последующих запусках программа (скрипт) должна сравнить свои предыдущие записи с действительностью,
выдать вердикт, но все равно опять обновить свои записи о текущих размерах файлов.
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Re: Проверка и удаление файлов

Yuriy сказал(а):
при первом запуске скрипта программа (скрипт)
должна сначала записать в некую свою базу (или файл) все эти значения для сравнения.
Да! Но лучше, конечно чтобы они были прописаны в самом скрипте.

Yuriy сказал(а):
При последующих запусках программа (скрипт) должна сравнить свои предыдущие записи с действительностью,
выдать вердикт, но все равно опять обновить свои записи о текущих размерах файлов.
Нужна однократная запись. Например, при запуске, скрипт (скрытно) проверяет определенные файлы, записанные в его базе (или в нем самом) и если какой-либо файл (который в его базе прописан) не сходится, то выдается сообщение, что файл изменился. Получается на подобие программы-защиты файлов от изменения.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Проверка и удаление файлов

in-com [?]
Нужна однократная запись. Например, при запуске, скрипт (скрытно) проверяет определенные файлы, записанные в его базе (или в нем самом)

Для этого достаточно в моем примере заменить :
Код:
$sVar = FileOpenDialog("Select Files", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "(*.txt)", 5)
на
$sVar=@ScriptDir & "|1.txt|2.txt|n.txt" ; Формат для данного скрипта :  Папка  | Файл 1 |  Файл 2 и т.д




Ввиду необходимости выдачи информации об имени изменившегося файла здесь
вместо сравнения используется :
Код:
StringReplace
(Удаление из дефолтной строки имен и размеров неизменившихся файлов)
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Re: Проверка и удаление файлов

gregaz сказал(а):
достаточно в моем примере заменить
Да, но нужно не только прописать проверяемые файлы, но еще и их размер или Md5 т.е. файл 1.txt размером 10кб, файл 2.txt размером 35,2кб и т.д. и если хотя-бы один из них изменится то скрипт выдавал бы сообщение. То есть скрипт запустился, автоматически проверил файлы и если все в порядке (размер каждого файла совпадает), запустил нужную программу и закрылся.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Проверка и удаление файлов

in-com [?]
Да, но нужно не только прописать проверяемые файлы, но еще и их размер или Md5 т.е. файл 1.txt размером 10кб, файл 2.txt размером 35,2кб и т.д

В самом скрипте размер не пропишешь.
Для этого надо создавать отдельный файл (скажем Test.ini) и занести туда имена файлов и их размеры.
Делается это элементарно.
 

HelpMe

Новичок
Сообщения
85
Репутация
3
Re: Проверка и удаление файлов

Как решить - не знаю... но могу предложить простую альтернативу...
1. Копируются нужные файлы отдельно
2. удаляется всё
3. вставить/переместить назад что скопированно...
:blink:
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Re: Проверка и удаление файлов

gregaz сказал(а):
Для этого надо создавать отдельный файл (скажем Test.ini) и занести туда имена файлов и их размеры
Вроде сделал, но что-то не работает
Код:
#include<GuiConstantsEx.au3>

$sVar = IniRead("files_to_control.ini", "section2", "1.txt", "4096") ; Проверяемый файл и его размер
$sVar = IniRead("files_to_control.ini", "section3", "2.exe", "236472")
$sVar = IniRead("files_to_control.ini", "section4", "3.dll", "714504")
$sVar = IniRead("files_to_control.ini", "section5", "4.txt", "1256")
$sVar = IniRead("files_to_control.ini", "section6", "5.txt", "33026")
$aVar=StringSplit($sVar,"|"); Массив контролируемых файлов

$sCheckedText=CheckFiles($aVar)
$sDefoult=$sCheckedText
ConsoleWrite($sCheckedText & @LF)

While 1
            $sCheckedText=CheckFiles($aVar,$sDefoult)
            If $sCheckedText=$sDefoult  Then
                Exit
            Else    
                MsgBox(0,'Внимание !!!','Размер файла : ' & @CRLF & $sCheckedText & "изменился.")
                ;ContinueLoop
                Exit
            EndIf
            $sDefoult=$sCheckedText
            ; ******** Здесь возможный запуск какой-то программы
            ; ShellExecute(******.***) или Run(******.***)
WEnd

Func CheckFiles($aFiles,$sDef='')
    Local $sText 
    For $i=2 To UBound($aFiles)-1
        $iFileSize=FileGetSize($aFiles[1] & '\' & $aFiles[$i])
        $sDef=StringReplace($sDef,$aFiles[1] & '\' & $aFiles[$i] & "|" & $iFileSize & @CRLF,"")
        $sText &=$aFiles[1] & '\' & $aFiles[$i] & "|" & $iFileSize & @CRLF
    Next    
    If $sDef <> "" Then Return $sDef
    Return $sText
EndFunc

И в файле files_to_control.ini прописал
Код:
1.txt 4096
2.exe 236472
3.dll 714504
4.txt 1256
5.txt 33026
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
С наступающим Вас форумчане !
 
Автор
I

in-com

Новичок
Сообщения
28
Репутация
0
Уважаемая администрация! Перенесите эту тему в раздел "Стол заказов"
С уважением, In-com
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
b]in-com[/b] [?]
Вроде сделал, но что-то не работает
Неверны запись и чтение файла -INI
При использовании ini-файла код совсем упрощается
Может не надо переносить ,если устроит такой вариант:

Запись в файле -ини :
Код:
[FILE_SIZES]
1.txt=4096
2.exe=236472
3.dll=714504
4.txt=1256
5.txt=33026
Скрипт :
Код:
#include<GuiConstantsEx.au3>
#include<Array.au3>

Global $i_FileSize
$sIniFile=@ScriptDir & "\files_to_control.ini"
$aVar=IniReadSection($sIniFile,"FILE_SIZES")
_ArrayDisplay($aVar)

$iChecked=CheckFiles($aVar)
If $iChecked <> -1  Then 
   MsgBox(0,'Внимание !!!','Размер файла : ' & @CRLF & $aVar[$iChecked][0] & " :  ИЗМЕНИЛСЯ. " & _ 
		 @CRLF & "Был : " & $aVar[$iChecked][1] & @CRLF & "Стал : " & $i_FileSize)
   Exit
EndIf 

MsgBox(0,'Инфо','Размеры сохранились',1)
; ******** Здесь возможный запуск какой-то программы
; ShellExecute(******.***) или Run(******.***)

Func CheckFiles($aFiles)
   For $i=1 To UBound($aFiles,1)-1
	  $i_FileSize=FileGetSize($aFiles[$i][0])
	  $sDefoultSize=$aFiles[$i][1]
	  If $i_FileSize <> $sDefoultSize Then Return $i  ; Номер элемента мвссива
   Next
   Return -1
EndFunc
 
Верх