;Автор идеи Tol!k, батник: http://forum.wincmd.ru/viewtopic.php?p=56916#56916
;Скрипт AutoIt http://forum.wincmd.ru/viewpost.php?p=112570
;2018.04.23
;Писалось и проверялось с AutoIt версии 3.3.8.1
;
;Описание:
; Скрипт для проверки файлов JPEG (поиск повреждённых и/или недокаченных), при проверке происходит попытка оптимизация таблицы Хаффмана с помощью jpegtran.
;jpegtran.exe должен лежать рядом со скриптом.
;
;Возможности, нюансы:
;1. Возможно использовать jpegtran из проекта libjpeg-turbo (https://libjpeg-turbo.org/Main/HomePage), даёт существенный прирост скорости.
; Версии под Win могут быть скомпилированы GCC (в MinGW/MinGW-w64) или в Visual C++ (2008 и выше), требуется второе.
; Положить в подкаталоги рядом со скриптом:
; libjpeg-turbo-vc\jpegtran.exe
; libjpeg-turbo-vc64\jpegtran.exe
; При выборе libjpeg-turbo на x64 ОС автоматически будет выбрана х64 версия jpegtran (если доступна).
; Если опция выбрана, но исполняемые файлы не найдены, то будет использоваться jpegtran.exe рядом со скриптом.
;2. В поле ввода пути поддерживается drag and drop.
;3. В поле ввода можно использовать переменные окружения.
;4. Возможно использовать файл-список (например, результат поиска): *.tmp для ТС и *.lst для DC, список должен быть в UTF-16LE.
;5. Возможно указать имена папок для исключения из поиска, формат записи:
; ваша папка для поиска|папка для исключения1|папка для исключения2
; или
; полный путь к файлу-списку|папка для исключения1|папка для исключения2
; Имя папки для исключения ищется в любом месте полного имени файла!
; В поле ввода кавычки не нужны, а при запуске с параметрами необходимо брать в кавычки всю эту строку целиком.
;6. Закрытие окна и прерывание задания (нчать с того же места не получится) необходимо подтверждать.
;7. Нажатия клавиш в окне: Shift+Enter - аналог кнопки Выполнить, Esc - прерывает проверку (без закрытия окна).
;8. Префикс "\\?\" для длинных путей (больше MAX_PATH) используется по умолчанию (на WinXP путь всё равно обрезается, решение (пока) не нашёл, разработчикам jpegtran писал - не ответили).
; При необходимости можно попробовать каталог с изображениями подключить как диск:
; subst [выбранная свободная буква:] [полный путь к каталогу]
;9. Возможно писать результат в nul (может быть быстрее + экономия записи на HDD).
; Проверено в WinXP SP3 и Win7x64, но без 100%-й гарантии.
;10. Есть возможность сгенерировать cmd-файлы для копирования (с созданием дерева каталогов) и удаления файлов, попавших в лог (см. примечания!).
; Для создания дерева каталогов необходимо, чтобы была включена расширенная обработка команд (обычно включено по умолчанию на Win2000/WinXP и выше), на всякий случай в cmd-файл копирования дописывается "SetLocal EnableExtensions".
;11. Скрипты нумеруются начиная с 1, на случай запуска нескольких копий, число дописывается в имена временных и лог-файлов, в заголовок окна и заголовки сообщений.
;
;Скрипт поддерживает параметры командной строки:
; "path" - путь к каталогу или файлу-списку (в UTF-16LE!);
; --recurs - рекурсивно;
; --nul - писать результат в nul;
; --turbo - использовать libjpeg-turbo.
;Синтаксис регистрозависимый!
;
;ПРИМЕЧАНИЕ: В лог-файл могут попасть не только повреждённые файлы, это могут быть:
; - файлы, на которых Jpegtran по какой-то причине завис;
; - очень большие файлы, для обработки которых недостаточно памяти (Jpegtran 32-хбитный);
; - файлы, в полном имени которых содержатся символы вне текущей системной неюникодной локали (Jpegtran не поддерживает юникод).
;Проверяйте лог!
;ПРИМЕЧАНИЕ: То, что файл с проблемами, не значит, что он повреждён фатально и нельзя попробовать открыть его в графическом редакторе и пересохранить.
;
#NoTrayIcon
Opt('WinWaitDelay', 100)
Opt('GUICloseOnESC', 0)
Opt('MustDeclareVars', 1)
Global Const $GUI_CHECKED = 1
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4
Global Const $GUI_DROPACCEPTED = 8
Global Const $GUI_ENABLE = 64
Global Const $GUI_DISABLE = 128
Global Const $WS_EX_ACCEPTFILES = 0x00000010
Global Const $SS_RIGHT = 0x2
Local $sTemp, $iNum = 1, $iFE86 = 0, $iFE64 = 0, $iJT = 0, $iD = 0, $hGui, $L0, $L1, $L2, $Input, $B1, $C1, $C2, $C3, $L2, $L3, $L4, $B2, $B3, $B4, $Dummy
Global $fStartWork = False
;Определяем папку для временного файла и лога
$sTemp = EnvGet('TEMP')
;Проверяем существование окон для индекса $iNum
While 1
Sleep(25)
If Not WinExists('FileTest - ' & @ScriptName & ' (' & $iNum & ')') Then
If FileExists($sTemp & '\jpegtest' & $iNum & '.log') Then
$iNum += 1
ContinueLoop
Else
ExitLoop
EndIf
Else
$iNum += 1
ContinueLoop
EndIf
WEnd
;Проверяем параметры запуска
If $CmdLine[0] > 4 Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверьте параметры запуска!' & @CRLF & @CRLF & _
'Допустимы:' & @CRLF & _
' "path": каталог с изображениями или путь к файлу списка;' & @CRLF & _
' --recurs: рекурсивно;' & @CRLF & _
' --nul: писать результат в nul;' & @CRLF & _
' --turbo: использовать libjpeg-turbo.')
EndIf
;Проверяем наличие jpegtran.exe
If Not FileExists(@ScriptDir & '\jpegtran.exe') Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Файл "jpegtran.exe" не найден!' & @CRLF & 'Выходим.')
Exit
EndIf
If FileExists(@ScriptDir & '\libjpeg-turbo-vc\jpegtran.exe') Then
$iJT = 1
$iFE86 = 1
EndIf
If FileExists(@ScriptDir & '\libjpeg-turbo-vc64\jpegtran.exe') Then
$iJT += 1
$iFE64 = 1
EndIf
__GUI()
Func __GUI()
Opt('GUIOnEventMode', 1) ;режим OnEvent
$hGui = GUICreate('FileTest - ' & @ScriptName & ' (' & $iNum & ')', 400, 240, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE, '__OnExit')
GUISetOnEvent($GUI_EVENT_MINIMIZE, '__OnMinimize')
$L0 = GUICtrlCreateLabel('Каталог или файл-список с изображениями (drag-and-drop работает):', 14, 8, 360, 22)
$Input = GUICtrlCreateInput('', 8, 26, 360, 22) ;принимает перетаскиваемые в Input файлы (drag and drop)
GUICtrlSetState($Input, $GUI_DROPACCEPTED)
$B1 = GUICtrlCreateButton('...', 372, 26, 22, 22)
GUICtrlSetOnEvent($B1, '__OnClickB1')
$L1 = GUICtrlCreateLabel('Форматы: *.jpg, *.jpeg, *.jpe', 120, 50, 170, 22)
GUICtrlSetColor($L1, 0x4b4b4b)
$C1 = GUICtrlCreateCheckbox('Рекурсивно', 14, 62, 100, 22)
$C2 = GUICtrlCreateCheckbox('Результат в nul', 14, 86, 120, 22)
$C3 = GUICtrlCreateCheckbox('libjpeg-turbo (автовыбор x32/x64)', 140, 86, 206, 22)
GUICtrlCreateGroup('Статус:', 10, 116, 300, 66)
$L2 = GUICtrlCreateLabel('всего файлов / номер текущего / *с ошибкой:', 20, 136, 270, 22)
GUICtrlSetColor($L2, 0x4b4b4b)
$L3 = GUICtrlCreateLabel('', 22, 156, 90, 22, $SS_RIGHT)
$L4 = GUICtrlCreateLabel('', 120, 156, 168, 22)
;GUICtrlSetColor($L4, 0xff0000)
GUICtrlCreateGroup('..', -99, -99, 1, 1) ;закрывает группу
$B2 = GUICtrlCreateButton('Выполнить', 320, 116, 70, 30)
GUICtrlSetOnEvent($B2, '__StartWork')
$B3 = GUICtrlCreateButton('Выход', 320, 156, 70, 30)
GUICtrlSetOnEvent($B3, '__OnExit')
$B4 = GUICtrlCreateButton('Создать cmd-файлы копирования/удаления', 20, 190, 280, 24)
GUICtrlSetOnEvent($B4, '__GenCMDFiles')
GUICtrlSetState($B4, $GUI_DISABLE)
$L2 = GUICtrlCreateLabel('Для остановки проверки используйте клавишу Esc!', 5, 225, 305, 20)
GUICtrlSetColor($L2, 0x800000)
$Dummy = GUICtrlCreateDummy()
GUICtrlSetOnEvent($Dummy, '__StartWork')
Local $aAccelKeys[2][2] = [['{Esc}', $Dummy],['+{Enter}', $B2]]
GUISetAccelerators($aAccelKeys)
If $iJT = 0 Then GUICtrlSetState($C3, $GUI_DISABLE)
If $CmdLine[0] > 0 Then
For $i = 1 To $CmdLine[0]
If $CmdLine[$i] <> '--recurs' And $CmdLine[$i] <> '--nul' And $CmdLine[$i] <> '--turbo' Then
GUICtrlSetData($Input, $CmdLine[$i])
ContinueLoop
EndIf
If $CmdLine[$i] == '--recurs' Then
GUICtrlSetState($C1, 1)
$iD = 125
ContinueLoop
EndIf
If $CmdLine[$i] == '--nul' Then
GUICtrlSetState($C2, 1)
ContinueLoop
EndIf
If $CmdLine[$i] == '--turbo' Then
If $iJT > 0 Then GUICtrlSetState($C3, 1)
ContinueLoop
EndIf
Next
EndIf
GUISetState()
While 1
GUICtrlSetOnEvent($Dummy, '')
If $fStartWork = True Then
$fStartWork = False
If StringLen(GUICtrlRead($Input)) < 1 Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Поле ввода пустое!')
Else
__Work(GUICtrlRead($Input))
EndIf
EndIf
Sleep(50)
WEnd
EndFunc ;==>__GUI
Func __StartWork()
$fStartWork = True
EndFunc
Func __OnExit()
If MsgBox(4 + 48 + 4096, 'JPEGtest (' & $iNum & ')', 'Действительно закрыть?', '', $hGui) = 6 Then Exit
EndFunc
Func __OnMinimize()
GUISetState(@SW_MINIMIZE, $hGui)
EndFunc
Func __OnClickB1()
GUICtrlSetData($Input, __SelectFolder())
EndFunc
Func __SelectFolder()
Local $sPath
While 1
$sPath = FileSelectFolder('Укажите каталог с изображениями', '', 2 + 4, '', $hGui)
If @error And $sPath = '' Then ExitLoop
If @error Or Not StringInStr(FileGetAttrib($sPath), 'D') Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', 'Вы указали "' & $sPath & '", а не каталог!', '', $hGui)
Else
ExitLoop
EndIf
WEnd
Return $sPath
EndFunc ;==>__SelectFolder
Func __Work($sPath)
Local $sExcludeFolders, $aFileList, $hFile, $sFile, $sD, $lst, $sUtil = @ScriptDir & '\jpegtran.exe', $sResult, $i, $iPID, $sOut = '', $sError = '', $iError = 0, $sAllErrs = '', $iExit = 0
If BitAND(GUICtrlRead($C1), $GUI_CHECKED) = $GUI_CHECKED Then $iD = 125
;Local $timer = TimerInit()
$sPath = _WinAPI_ExpandEnvironmentStrings($sPath)
If StringInStr($sPath, '|', 1) Then
$sExcludeFolders = StringRegExpReplace($sPath, '^[^\|]+\|', '', 1)
$sPath = StringRegExpReplace($sPath, '^([^\|]+)(\|.*)$', '\1', 1)
Else
$sExcludeFolders = ''
EndIf
If Not StringRegExp($sPath, '^[A-Za-z]:\\$', 0) Then
$sPath = StringRegExpReplace($sPath, '(?m)\\$', '')
EndIf
If Not FileExists($sPath) Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', '"' & $sPath & '"' & @CR & 'не найден!', '', $hGui)
Return 0
EndIf
GUICtrlSetData($L3, '')
GUICtrlSetData($L4, '')
GUICtrlSetState($Input, $GUI_DISABLE)
GUICtrlSetState($C1, $GUI_DISABLE)
GUICtrlSetState($C2, $GUI_DISABLE)
GUICtrlSetState($C3, $GUI_DISABLE)
GUICtrlSetState($B1, $GUI_DISABLE)
GUICtrlSetState($B2, $GUI_DISABLE)
GUICtrlSetState($B3, $GUI_DISABLE)
GUICtrlSetState($B4, $GUI_DISABLE)
GUICtrlSetOnEvent($Dummy, '__StartWork')
;Получаем массив со всеми файлами (или не получаем :))
If StringRegExp($sPath, '(?im)\.(tmp|lst)$') Then
;Открываем и читаем файл-список
$hFile = FileOpen($sPath, 0 + 32)
If $hFile = -1 Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не удалось открыть файл-список.', '', $hGui)
GUICtrlSetState($Input, $GUI_ENABLE)
GUICtrlSetState($C1, $GUI_ENABLE)
GUICtrlSetState($C2, $GUI_ENABLE)
If $iJT > 0 Then
GUICtrlSetState($C3, $GUI_ENABLE)
EndIf
GUICtrlSetState($B1, $GUI_ENABLE)
GUICtrlSetState($B2, $GUI_ENABLE)
GUICtrlSetState($B3, $GUI_ENABLE)
Return 0
EndIf
$sFile = FileRead($hFile)
FileClose($hFile)
;Проверяем конец строки - DOS/Unix/Mac
Select
Case StringInStr($sFile, @CRLF) > 0
$sD = @CRLF
Case StringInStr($sFile, @LF) > 0
$sD = @LF
Case Else
$sD = @CR
EndSelect
;Убираем пустую строку в конце, если есть:
$sFile = StringStripWS($sFile, 2)
;Добавляем префикс \\?\
$sFile = StringRegExpReplace($sFile, '(?ms)^([^\r\n])', '\\\\?\\\1')
;Помещаем строки в массив
$aFileList = StringSplit($sFile, $sD, 1)
$sFile = ''
Else
$aFileList = _FO_FileSearch('\\?\' & $sPath, 'jpg|jpeg|jpe', True, $iD, 1, 1, 2, 0, $sExcludeFolders, -1)
If @error Then
Switch @error
Case 1
MsgBox(16 + 4096, 'JPEGTest.au3 - _FO_FileSearch():', 'Неверный путь!', '', $hGui)
Case 2
MsgBox(16 + 4096, 'JPEGTest.au3 - _FO_FileSearch():', 'Неверная маска!', '', $hGui)
Case 3
MsgBox(16 + 4096, 'JPEGTest.au3 - _FO_FileSearch():', 'Ничего не найдено!', '', $hGui)
EndSwitch
GUICtrlSetState($Input, $GUI_ENABLE)
GUICtrlSetState($C1, $GUI_ENABLE)
GUICtrlSetState($C2, $GUI_ENABLE)
If $iJT > 0 Then
GUICtrlSetState($C3, $GUI_ENABLE)
EndIf
GUICtrlSetState($B1, $GUI_ENABLE)
GUICtrlSetState($B2, $GUI_ENABLE)
GUICtrlSetState($B3, $GUI_ENABLE)
Return 0
EndIf
EndIf
GUICtrlSetData($L3, $aFileList[0])
$hFile = FileOpen($sTemp & '\jpegtest' & $iNum & '.log', 2 + 128)
If $hFile = -1 Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не удалось открыть файл для записи лога.', '', $hGui)
Return 0
EndIf
;
If $iJT > 0 And BitAND(GUICtrlRead($C3), $GUI_CHECKED) = $GUI_CHECKED Then
Select
Case @OSArch = 'X64' And $iFE64 = 1
$sUtil = @ScriptDir & '\libjpeg-turbo-vc64\jpegtran.exe'
Case @OSArch = 'X64' And $iFE86 = 1
$sUtil = @ScriptDir & '\libjpeg-turbo-vc\jpegtran.exe'
Case @OSArch = 'X86' And $iFE86 = 1
$sUtil = @ScriptDir & '\libjpeg-turbo-vc\jpegtran.exe'
EndSelect
EndIf
If BitAND(GUICtrlRead($C2), $GUI_CHECKED) = $GUI_CHECKED Then
$sResult = 'nul'
Else
$sResult = '"' & $sTemp & '\jpegtest' & $iNum & '.jpg"'
EndIf
;Цикл проверки
For $i = 1 To $aFileList[0]
If $fStartWork = True Then
$fStartWork = False
If MsgBox(4 + 48 + 4096, 'JPEGtest (' & $iNum & ')', 'Действительно прервать?', '', $hGui) = 6 Then
$iExit = 1
ExitLoop;
EndIf
EndIf
GUICtrlSetData($L4, $i & ' / *' & $iError)
$sOut = ''
$iPID = Run('"' & $sUtil & '" -optimize -outfile ' & $sResult & ' "' & $aFileList[$i] & '"', @ScriptDir, @SW_HIDE, 4)
ProcessWaitClose($iPID, 30)
If ProcessExists($iPID) Then
ProcessClose($iPID)
$sAllErrs &= $aFileList[$i] & @TAB & 'процесс завис на этом файле, принудительно завершен' & @CRLF
$iError += 1
ContinueLoop
EndIf
$sOut = StderrRead($iPID)
If $sOut Then
If StringInStr($sOut, "jpegtran.exe: can't open") Then
$sAllErrs &= $aFileList[$i] & @TAB & "Can't open file for reading (Unicode or long path?)" & @CRLF
$iError += 1
Else
$sError = StringRegExpReplace($sOut, '[\r\n]+', ' ')
$sAllErrs &= $aFileList[$i] & @TAB & $sError & @CRLF
$iError += 1
$sError = ''
EndIf
EndIf
Next
If $sAllErrs Then
$sAllErrs = StringReplace($sAllErrs, '\\?\', '', 0, 1)
FileWrite($hFile, $sAllErrs)
EndIf
FileClose($hFile)
FileSetAttrib($sTemp & '\jpegtest' & $iNum & '.jpg', '-RST')
FileDelete($sTemp & '\jpegtest' & $iNum & '.jpg')
;MsgBox(4096, 'Время выполнения', 'Время: ' & TimerDiff($timer) & ' мс')
;Результат
Select
Case $iExit = 1
If $iError = 0 Then
MsgBox(64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка была прервана, ошибок: 0', '', $hGui)
FileSetAttrib($sTemp & '\jpegtest' & $iNum & '.log', '-RST')
FileDelete($sTemp & '\jpegtest' & $iNum & '.log')
Else
If MsgBox(4 + 64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка была прервана, ошибок: ' & _
$iError & '.' & @CR & @CR & 'Лог сохранен в "' & $sTemp & '", открыть?', '', $hGui) = 6 Then
;__OpenLog($sTemp & '\jpegtest' & $iNum & '.log')
ShellExecute($sTemp & '\jpegtest' & $iNum & '.log')
EndIf
GUICtrlSetState($B4, $GUI_ENABLE)
EndIf
GUICtrlSetState($Input, $GUI_ENABLE)
GUICtrlSetState($C1, $GUI_ENABLE)
GUICtrlSetState($C2, $GUI_ENABLE)
If $iJT > 0 Then
GUICtrlSetState($C3, $GUI_ENABLE)
EndIf
GUICtrlSetState($B1, $GUI_ENABLE)
GUICtrlSetState($B2, $GUI_ENABLE)
GUICtrlSetState($B3, $GUI_ENABLE)
Return 2
Case $iExit = 0
If $iError = 0 Then
MsgBox(64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка завершена, ошибок: 0', '', $hGui)
FileSetAttrib($sTemp & '\jpegtest' & $iNum & '.log', '-RST')
FileDelete($sTemp & '\jpegtest' & $iNum & '.log')
Else
Switch MsgBox(4 + 64 + 4096, 'JPEGtest (' & $iNum & ')', 'Проверка завершена, ошибок: ' & _
$iError & '.' & @CR & @CR & 'Лог сохранен в "' & $sTemp & '", открыть?', '', $hGui)
Case 6
;__OpenLog($sTemp & '\jpegtest' & $iNum & '.log')
ShellExecute($sTemp & '\jpegtest' & $iNum & '.log')
EndSwitch
GUICtrlSetState($B4, $GUI_ENABLE)
EndIf
GUICtrlSetState($Input, $GUI_ENABLE)
GUICtrlSetState($C1, $GUI_ENABLE)
GUICtrlSetState($C2, $GUI_ENABLE)
If $iJT > 0 Then
GUICtrlSetState($C3, $GUI_ENABLE)
EndIf
GUICtrlSetState($B1, $GUI_ENABLE)
GUICtrlSetState($B2, $GUI_ENABLE)
GUICtrlSetState($B3, $GUI_ENABLE)
Return 1
EndSelect
EndFunc ;==>__Work
Func __GenCMDFiles()
Local $sPath, $iFlag = 0, $sNote, $sMkDir = '|', $sCopy = '', $hFile, $sFile, $sD, $aList, $i, $sTName, $sTDir, $sTmp, $sTmp2 = '', $aRet, $sDos
GUICtrlSetState($B4, $GUI_DISABLE)
;Примечание для батников
$sNote = 'rem ПРИМЕЧАНИЕ: В лог-файл могут попасть не только поврежденные файлы, это могут быть:' & @CRLF & _
'rem - файлы, на которых Jpegtran по какой-то причине завис;' & @CRLF & _
'rem - очень большие файлы, для обработки которых недостаточно памяти (Jpegtran 32-хбитный);' & @CRLF & _
'rem - файлы, в полном имени которых содержатся символы вне текущей системной неюникодной локали (Jpegtran не поддерживает юникод).' & @CRLF & _
'rem Проверяйте лог!' & _
'rem ПРИМЕЧАНИЕ: То, что файл с проблемами, не значит, что он повреждён фатально и нельзя попробовать открыть его в графическом редакторе и пересохранить.' & @CRLF & @CRLF
;Проверяем наличие файла лога
If Not FileExists($sTemp & '\jpegtest' & $iNum & '.log') Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не найден файл лога jpegtest' & $iNum & '.log!', '', $hGui)
Return -1
EndIf
;Получаем путь назначения
While 1
$sPath = FileSelectFolder('Укажите каталог назначения:', '', 1 + 2 + 4, '', $hGui)
If @error And $sPath = '' Then ExitLoop
If @error Or Not StringInStr(FileGetAttrib($sPath), 'D') Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ')', 'Вы указали "' & $sPath & '", а не каталог!', '', $hGui)
Else
ExitLoop
EndIf
WEnd
If StringLen($sPath) < 3 Then Return -2
;Уточняем флаг открытия файла (для правильной работы на 3.3.14.0 и выше)
If StringReplace(@AutoItVersion, '.', '') >= 33140 Then $iFlag += 512
;Открываем и читаем лог
$hFile = FileOpen($sTemp & '\jpegtest' & $iNum & '.log', 0 + 128)
If $hFile = -1 Then
MsgBox(48 + 4096, 'JPEGtest (' & $iNum & ') - Ошибка!', 'Не удалось открыть для чтения файл лога jpegtest' & $iNum & '.log!', '', $hGui)
Return -3
EndIf
$sFile = FileRead($hFile)
FileClose($hFile)
;Проверяем конец строки - DOS/Unix/Mac
Select
Case StringInStr($sFile, @CRLF) > 0
$sD = @CRLF
Case StringInStr($sFile, @LF) > 0
$sD = @LF
Case Else
$sD = @CR
EndSelect
;Убираем пустую строку в конце, если есть:
$sFile = StringStripWS($sFile, 2)
;Убираем причину
$sFile = StringRegExpReplace($sFile, '(?m)^([^\r\n\t]+)(\t)([^\r\n]+)', '\1')
;Убираем префикс
$sFile = StringRegExpReplace($sFile, '(?m)^\\\\\?\\', '')
;Помещаем строки в массив
$aList = StringSplit($sFile, $sD, 1)
;Генерируем батник копирования (с созданием дерева каталогов)
For $i = 1 To $aList[0]
$sTName = StringReplace($aList[$i], ':\', '\')
$sTName = StringReplace($sPath & '\' & $sTName, '\\', '\')
$sTDir = StringRegExpReplace($sTName, '\\[^\\]*$', '')
If Not StringInStr($sMkDir, '|' & $sTDir & '|') Then
$sMkDir &= $sTDir
$sMkDir &= '|'
EndIf
$sTmp = 'copy "' & $aList[$i] & '" "' & $sTName & '"'
$sCopy &= $sTmp
$sCopy &= @CRLF
Next
$sMkDir = StringTrimRight(StringTrimLeft($sMkDir, 1), 1)
$sMkDir = StringReplace($sMkDir, '|', '"' & @CRLF & 'mkdir "')
$sTmp = $sNote & 'SetLocal EnableExtensions' & @CRLF & 'mkdir "' & $sMkDir & '"' & @CRLF & $sCopy
$hFile = FileOpen($sPath & '\jpegtest_copy' & $iNum & '.cmd', 2 + $iFlag)
$aRet = DllCall('user32.dll', 'bool', 'CharToOemA', 'str', $sTmp, 'str', '')
$sDos = $aRet[2]
FileWrite($hFile, $sDos)
FileClose($hFile)
;Генерируем батник удаления
For $i = 1 To $aList[0]
$sTmp2 &= 'del /f /q "'
$sTmp2 &= $aList[$i]
$sTmp2 &= '"'
$sTmp2 &= @CRLF
Next
$hFile = FileOpen($sPath & '\jpegtest_delete' & $iNum & '.cmd', 2 + $iFlag)
$aRet = DllCall('user32.dll', 'bool', 'CharToOemA', 'str', $sNote & $sTmp2, 'str', '')
$sDos = $aRet[2]
FileWrite($hFile, $sDos)
FileClose($hFile)
MsgBox(64 + 4096, 'JPEGtest (' & $iNum & ')', 'Готово!')
GUICtrlSetState($B4, $GUI_ENABLE)
EndFunc ;==>__GenCMDFiles
#Region ;UDF
;WinAPI.au3
Func _WinAPI_ExpandEnvironmentStrings($sString)
Local $aResult = DllCall("kernel32.dll", "dword", "ExpandEnvironmentStringsW", "wstr", $sString, "wstr", "", "dword", 4096)
If @error Then Return SetError(@error, @extended, "")
Return $aResult[2]
EndFunc ;==>_WinAPI_ExpandEnvironmentStrings
;FileOperations.au3, 1.8.5 (2014.05.26) Edited version!
Func _FO_FileSearch($sPath, $sMask = '*', $fInclude = True, $iDepth = 125, $iFull = 1, $iArray = 1, $iTypeMask = 1, $sLocale = 0, $vExcludeFolders = '', $iExcludeDepth = -1)
Local $vFileList
If $sMask = '|' Then Return SetError(2, 0, '')
If Not FileExists($sPath) Then Return SetError(1, 0, '')
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
If $vExcludeFolders Then
$vExcludeFolders = StringSplit($vExcludeFolders, '|')
Else
Dim $vExcludeFolders[1] = [0]
EndIf
__FO_FileSearchType($vFileList, $sPath, '|' & $sMask & '|', $fInclude, $iDepth, $vExcludeFolders, $iExcludeDepth)
If Not $vFileList Then Return SetError(3, 0, '')
$vFileList = StringTrimRight($vFileList, 2)
$vFileList = StringSplit($vFileList, @CRLF, 1)
Return $vFileList
EndFunc ;==>_FO_FileSearch
Func __FO_FileSearchType(ByRef $sFileList, $sPath, $sMask, ByRef $fInclude, ByRef $iDepth, ByRef $aExcludeFolders, ByRef $iExcludeDepth, $iCurD = 0)
Local $iPos, $sFile, $s = FileFindFirstFile($sPath & '*')
If $s = -1 Then Return
While 1
$sFile = FileFindNextFile($s)
If @error Then ExitLoop
If @extended Then
If $iCurD >= $iDepth Or ($iCurD <= $iExcludeDepth And __ChExcludeFolders($sFile, $aExcludeFolders)) Then ContinueLoop
__FO_FileSearchType($sFileList, $sPath & $sFile & '\', $sMask, $fInclude, $iDepth, $aExcludeFolders, $iExcludeDepth, $iCurD + 1)
Else
$iPos = StringInStr($sFile, ".", 0, -1)
If $iPos And StringInStr($sMask, '|' & StringTrimLeft($sFile, $iPos) & '|') = $fInclude Then
$sFileList &= $sPath & $sFile & @CRLF
ElseIf Not $iPos And Not $fInclude Then
$sFileList &= $sPath & $sFile & @CRLF
EndIf
EndIf
WEnd
FileClose($s)
EndFunc ;==>__FO_FileSearchType
Func __ChExcludeFolders(ByRef $sFile, ByRef $aExcludeFolders)
For $i = 1 To $aExcludeFolders[0]
If $sFile = $aExcludeFolders[$i] Then Return True
Next
Return False
EndFunc ;==>__ChExcludeFolders
#EndRegion ;UDF
|