Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R

вариант рабочей функции переименования (без контроля входных параматров!) - номера ранее переименованных файлов не трогаются, новые номера считаются от максимального существующего (поэтому возможны "дыры" в нумерации). По ходу производится приведение всех номеров к единому формату по количеству знаков в номере.
Код: Выделить весь код
#include <File.au3>
#include <Array.au3>
#Include <String.au3>

_FilesFormatRename ("c:\Test", "_")

Func _FilesFormatRename ($sPath, $delim = "_")
	Local $i, $iMaxNum
	;Считываем список файлов в массив
	Local $FileList = _FileListToArray($sPath, "*", 1)
	;Создаем рабочий массив: 
	Local $WorkList [$FileList[0]+1] [6]
		;[][0] - имя файла без расширения
		;[][1] - имя файла без расширения и номера
		;[][2] - только расширение
		;[][3] - старый номер
		;[][4] - новый номер
		;[][5] - индекс для сортировки
	;Заполняем рабочий массив
	For $i=1 To $FileList[0]
		;выделяем имя, расширение и номер
		$WorkList [$i][0] = StringRegExpReplace ($FileList[$i], "\.[^.]*$","")
		$WorkList [$i][1] = StringRegExpReplace ($WorkList [$i][0], $delim & '[0-9]*$',"")
		$WorkList [$i][2] = StringMid ($FileList[$i], StringLen ($WorkList [$i][0]) +2)
		$WorkList [$i][3] = StringMid ($WorkList [$i][0], StringLen ($WorkList [$i][1]) +2) +0
		;формируем индекс для сортировки
		$WorkList [$i][5] = $WorkList[$i][1] & "." & $WorkList[$i][2] & "." & StringFormat ("%." & StringLen($FileList[0]) & "d", $WorkList[$i][3])
	Next
	;Сортируем массив по убыванию старого номера
	_ArraySort ($WorkList, 1, 1, $FileList[0]+1, 6, 5)

	;Основной цикл перенумерации
	For $i=1 To $FileList [0]
		;проверка на совпадение имени
		If $WorkList[$i-1][1] & "." & $WorkList[$i-1][2] = $WorkList[$i][1] & "." & $WorkList[$i][2] Then
			;проверка на совпадение номера
			If $WorkList [$i][3] = $WorkList [$i-1][3] Then
				;если номера совпадают, добавляем в конец списка
				$iMaxNum = $iMaxNum +1
				$WorkList [$i][4] = $iMaxNum
			Else
				;если номера отличаются зачем менять? 
				$WorkList [$i][4] = $WorkList [$i][3]
			EndIf
		Else
			;максимальный номер для нового имени
			$iMaxNum=$WorkList [$i][3]
			$WorkList [$i][4] = $iMaxNum
		EndIf
		;формируем индекс для сортировки
		$WorkList [$i][5] = $WorkList[$i][1] & "." & $WorkList[$i][2] & "." & StringFormat ("%." & StringLen($FileList[0]) & "d", $WorkList[$i][4])
	Next
	;Сортируем массив по убыванию нового номера
	_ArraySort ($WorkList, 1, 1, $FileList[0]+1, 6, 5)
	;Подготовка к переименованию
	FileChangeDir ($sPath)
	FileSetAttrib("*", "-R") 
	;Собственно цикл переименования
	For $i=1 To $FileList [0]
		;проверка на совпадение имени
		If ($WorkList[$i-1][1] & "." & $WorkList[$i-1][2]) <> ($WorkList[$i][1] & "." & $WorkList[$i][2]) Then	$iMaxNum = $WorkList [$i][4]
		FileMove ($WorkList [$i][0] & "." & $WorkList [$i][2], _ 
			$WorkList [$i][1] & $delim & StringFormat ("%." & StringLen ($iMaxNum) & "d", $WorkList [$i][4]) & "." & $WorkList [$i][2])
	Next
EndFunc

Последний раз редактировалось amel27, 01-10-2006 в 16:42. Причина: правка скрипта

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:48, 01-10-2006 | #387