Что нового

Проверка архивов в папке на целостность

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Есть Папка-1
В ней довольно много файлов/архивов
Надо проверить все на целостность,
битые переместить в Папка-2

Файлы свернуты архиватором 7za.exe
По идее сама проверка происходит таким образом (если просто набирать из командной строки):

Код:
7za.exe t "один из файлов">nul
Echo %ErrorLevel%


Результатом этого является признак: 0 - хороший файл, 1 - битый
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот примерная схема:
1. Получаем файлы в папке, используя функции FileFindFirstFile / FileFindNextFile или же например _FileListToArray...
2. Перебираем файлы в цикле For / While и в итерации цикла делаем примерно следующее:
Код:
If RunWait('7za.exe t "один из файлов"', @ScriptDir & '\Папка-1', @SW_HIDE) = 0 Then ; хороший
	; ... ничего не делаем
Else ; битый
	FileMove(@ScriptDir & '\Папка-1\один из файлов', @ScriptDir & '\Папка-2\один из файлов', 1) ; битые переместить в Папка-2
EndIf

Пример реализации можно посмотреть в теме Re: Сравнение файлов в папках и их обработка Ответ #1.
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Видимо неверно смог объяснить.
7za.exe - архиватор, который действует из командной строки.
t - его ключ, проверяющий архив на целостность.

если написать командный файл (на котором работа 7za проходит хорошо) типа:

7za.exe t 61400000.64F >nul
echo %ErrorLevel%

то результатом вывода на экран станет либо 0 - хорошо, либо 1 - плохо

Суть - словить именно этот признак, ибо сама команда

'7za.exe t 61400000.64F' - не выводит признак целостности архива.

Извините, если с самого начала неверно сформулировал.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
ВиталийВВ [?]
echo %ErrorLevel%

то результатом вывода на экран станет либо 0 - хорошо, либо 1 - плохо
Это тоже самое, что и exit code, а его у нас RunWait возвращает. Из справки:
Запускает внешнюю программу и приостанавливает выполнение скрипта до завершения внешней программы.
Возвращаемое значение
Успех:
Возвращает код выхода из программы, которая была запущена.
Ошибка:
Возвращает 0 и устанавливает @error не равным нулю.


Добавлено:
Сообщение автоматически объединено:

Попробуйте указать ему полный путь к файлу:
Код:
RunWait('7za.exe t "C:\8\1\61400000.64F"')
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Код:
_main()
If @error Then Exit MsgBox(16, "Ошибка!!", "Нет файлов для обработки ", 3)
MsgBox(0, "Success", "Success", 3)

Func _main()
    Local $hFile, $sFilename ; объявление переменных
	
	$hFile = FileFindFirstFile("*.*F") ; начинаем искать
    If $hFile = -1 Or @error = 1 Then Return SetError(1, 0, 0)
	
	While 1
        $sFilename = FileFindNextFile($hFile) ; получаем файл из папки
		
		If @error Then ExitLoop ; если ошибка, то выход
        If @extended = 1 Then ContinueLoop ; если не файл, а каталог, пропустить и продолжить поиск далее
		
		; проверка:
		
		If RunWait('7za.exe t ' & $sFilename, '',  @SW_HIDE) = 0 Then ; хороший
    ; ... ничего не делаем
		Else ; битый
		FileMove('C:\8\' & $sFilename, 'C:\8\1\' & $sFilename, 1) ; битые переместить в Папка-2
		EndIf
	
	
	WEnd
    FileClose($hFile) ; закрыть указатель на поиск
    Return SetError(0, 0, 1)	
	
	
EndFunc   ;==>_main


Похоже - так и даже вроде работает!
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Спасибо, очень помогли, и, даже, научили!!! :smile: :IL_AutoIt_1:


Добавлено:
Сообщение автоматически объединено:

Код:
_main()
If @error Then Exit MsgBox(16, "Ошибка!!", "Нет файлов для обработки ", 3)
MsgBox(0, "Success", "Success", 3)

Func _main()
    Local $dir1, $dir2, $hFile, $sFilename ; объявление переменных
	
	; Существуют 2 папки:
    $dir1 = "C:\8\1\" ; Папка-1 (Где проверяется)
    $dir2 = "C:\8\bad\" ; Папка-2 (Куда кидать плохие)
	
	FileChangeDir($dir1)
	
	$hFile = FileFindFirstFile("*.*F") ; начинаем искать
    If $hFile = -1 Or @error = 1 Then Return SetError(1, 0, 0)
	
	While 1
        $sFilename = FileFindNextFile($hFile) ; получаем файл из папки
		
		If @error Then ExitLoop ; если ошибка, то выход
        If @extended = 1 Then ContinueLoop ; если не файл, а каталог, пропустить и продолжить поиск далее
		
		; проверка:
		
		If RunWait('C:\8\7za.exe t ' & $sFilename, '',  @SW_HIDE) = 0 Then ; хороший
    ; ... ничего не делаем
		Else ; битый
		FileMove($dir1 & $sFilename, $dir2 & $sFilename, 1) ; битые переместить в Папка-2
		EndIf
	
	
	WEnd
    FileClose($hFile) ; закрыть указатель на поиск
    Return SetError(0, 0, 1)	
	
	
EndFunc   ;==>_main


Более правильное решение задачи. В прошлом случае, как я написал, исходные файлы лежали в папке где и программа и все остальное.
Это решение позволяет выделить папку отдельно для Обрабатываемых файлов, и отдельно для Битых.

Добавилось:

Код:
$dir1 = "C:\8\1\" ; Папка-1 (Где проверяется)
    $dir2 = "C:\8\bad\" ; Папка-2 (Куда кидать плохие)
	
	FileChangeDir($dir1)
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
мой вариант без 7Z.exe
Код:
#include <7ZipM.au3>
#include <FileEx.au3>
Local $PFS = @ScriptDir & '\pfs'; исходная папка
Local $PFD = @ScriptDir & '\pfd';папка для битых
Local $FS = _FileSearch($PFS, '7z', 2), $res
If Not @error Then
	For $i = 1 To $FS[0]
		$res = _7ZipCheckArchive(_ANSIToOEM($FS[$i]))
		If Not $res Then FileMove($FS[$i], StringReplace($FS[$i], $PFS, $PFD), 9)
	Next
EndIf

http://autoit-script.ru/index.php?action=downloads;sa=view;down=509
 
Верх