Что нового

Сортировка массива по пути к файлу

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я уже написал выше, что исправил ошибку в шаблоне из-за которой NewC\ попадал не на своё место.
Вообще-то я сортировку каталогов вынес в отдельную функцию, потому что меня _ArraySort устраивает, а так кому как нравится.
 
A

Alofa

Гость
Вроде как тема решена, но все же...
Код:
#include <Array.au3>

;~ Dim $asArray[20] = ['NewA\B\A.jpg', 'New\A.jpg', 'Other\A.jpg','NewA\A.jpg', 'New\B\A.jpg', 'Other\B\B.jpg', 'Other\C.jpg', 'New1\C.jpg', 'Other\B\C.jpg', 'WOther\B.jpg', _
;~ 					'Other\X\Z.jpg', 'New\B.jpg', 'New2\A\B\C\D\E.jpg', 'New2\A\E.jpg', 'New1\A.jpg', 'NewB\A.jpg', 'NewB\B.jpg', 'NewC\C.jpg', 'OtherA\B\C\D\E.jpg', 'OtherA\B\C\D\F.jpg']
;~ Dim $asArray[9] = ['A.JPG', 'IMG_6567.JPG', 'IMG_657.JPG', 'IMG_6572.JPG', 'B.JPG', 'Other\IMG_6694.JPG', 'Other\IMG_6693.JPG', 'Home\IMG_6523.JPG', 'Home\IMG_6515.JPG']
Dim $asArray[8] = ['ДруGoy-57.jpg', 'OtherЖЖ\A\B.jpg\', 'Othe5rh\B\A.jpg', 'Other-24\B.jpg', 'ДруGoy.jpg', 'Other-5\C.jpg', 'Other\D\G\Z\ю.jpg', 'Other\D\G\Z\J\K\U\R\H\N\B\A.jpg']

_ArraySortEx($asArray)
_ArrayDisplay($asArray)

Func _ArraySortEx(ByRef $asArray)
	Local $asResNul, $iNum, $iNumDigits, $iSize = UBound($asArray) - 1
	For $i = 0 To $iSize
		$asRes = StringRegExp($asArray[$i], '^[^\\]+|(\\[^\\]+)', 3)

		Switch UBound($asRes) ; Здесь выполняется поиск цифр (при наличии) в конце корневого названия
			; Данное условие нуждается в проверке и доработке Патерна функции "StringRegExp".
			Case 1
				$asRes[0] = '!' & $asRes[0]
				$asResNul = StringRegExp($asRes[0], '^(.+[^\d])(\d*)(\.[^.]+)$', 3) ; Это если в названии присутствует расширение
				If @error Then ContinueCase
			Case Else
				$asResNul = StringRegExp($asRes[0], '^(.+[^\d])(\d*)($)', 3) ; Это если название без расширения
		EndSwitch
		If Not @error And $asResNul[1] Then ; Здесь производится маркировка найденных цифр в корневом названии
			$iNum = StringLen($asResNul[1])
			If $iNum > $iNumDigits Then $iNumDigits = $iNum
			$asRes[0] = $asResNul[0] & '>' & $asResNul[1] & '>' & $asResNul[2]
		EndIf
		
		$asArray[$i] = $asRes[0] & '|' & StringFormat('%03s', UBound($asRes)) & '|' & $asArray[$i]
	Next

	For $i = 0 To $iSize ; Снова "разбираем" каждую строку массива "$asArray" по маркерам для заполнения нулями цифр в конце корневого названия
		$asSplit = StringSplit($asArray[$i], '>')
		If Not @error And $iNumDigits Then
			$asSplit[2] = StringFormat('%0' & $iNumDigits & 's', $asSplit[2])
			$asArray[$i] = $asSplit[1] & $asSplit[2] & $asSplit[3]
		EndIf
	Next

	_ArraySort($asArray)

	For $i = 0 To $iSize
		$asArray[$i] = StringRegExpReplace($asArray[$i], '^.+\|', '')
	Next
EndFunc   ;==>_ArraySortEx
 
Верх