Что нового

нужна программа сортировки и переименования файлов для печати в минилабе

eugenillin

Новичок
Сообщения
3
Репутация
0
Latest version: v3.3.8.1

Доброе время!
Помогите, пожалуйста, решить задачу:

Описание:
У меня все графические файлы в папке поименованы в виде YYY по порядку.
Для отправки в печать минилаба некоторых из них, нужных, файлы необходимо переименовать как X=YYY, где X -количество экземпляров,
а YYY -оригинальный номер файла.
Зачастую список на печать приходится формировать из нескольких списков, где номера файлов даны вразброс, могут совпадать с номерами других списков.
В списках даются имена графических файлов, без путей или привязок, вразброс.
Нужна программка, которая объединит вбитые подряд списки, просуммирует повторяющиеся номера,
а затем переименует по вышеприведенному образцу заказанные графические файлы.
Сам неграмотный ;) а вручную тыкать мышью устал..

Примечания:
Почему X=YYY , спрашиваете? В длинном списке искать фотки, которых нужно сделать больше, чем по 1, будет легче, когда количество через знак "равно" написано слева. После сортировки рядом будут не №№, а одинаковое количество заказа, и проще будет раскидать по папкам

Проге нужно лишь суммировать повторяющиеся номера из вбитого мною списка, и переименовать по образцу "X=YYYY" из всех файлов в папке только упомянутые.

Надежда на Вас!
С уважением, Женя Ильин (фотограф)
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: программа сортировки и переименования файлов для печати в минилабе

eugenillin

Описание, конечно, о-очень понятное)

Как я понял:

есть файл, допустим, 1.txt, лежит там же где и скрипт
в нем список типа такого:
Код:
001.jpg
002.jpg
003.jpg
001.jpg
004.jpg
005.jpg
006.jpg
001.jpg
007.jpg
008.jpg
009.jpg
010.jpg
011.jpg
006.jpg
010.jpg
008.jpg
008.jpg

C:\1\ - начальная папка с фото
C:\2\ - папка для переименованных фото

Скрипт, берет из файла список, обрабатывает его (определяет, сколько повторов одних и тех же файлов),
потом копирует фото из начальной папки, одновременно переименовывая их:

Код:
#include <File.au3>

Dim $aTemp

$sFolderPath_1 = 'C:\1\' ; папка с фото
$sFolderPath_2 = 'C:\2\' ; папка для переименованных фото

$sFilePath = @ScriptDir & '\1.txt' ; путь до файла с именами фото

_FileReadToArray($sFilePath, $aTemp)

For $i = 1 To $aTemp[0]
	Assign($aTemp[$i], Eval($aTemp[$i]) + 1)
Next

Dim $uArray[$aTemp[0]][2] = [[0]]

For $i = 1 To $aTemp[0]
	If Eval($aTemp[$i]) > 0 Then
		$uArray[0][0] += 1
		$uArray[$uArray[0][0]][0] = $aTemp[$i]
		$uArray[$uArray[0][0]][1] = Eval($aTemp[$i])
		Assign($aTemp[$i], -1)
	EndIf
Next
ReDim $uArray[$uArray[0][0] + 1][2]


For $i = 1 To $uArray[0][0]
		FileCopy($sFolderPath_1 & '\' & $uArray[$i][0], $sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0]) ; копирование файлов
Next
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
Re: программа сортировки и переименования файлов для печати в минилабе

Не понял если списки
001
002
то просто посчитать файлы в папке и приписать справа? Это сделает любой переименователь файлов.
если списоки
001
001
то одинаковые файлы в папке невозможны
может тогда это префикс типа
001 - файл1.jpg
001 - файл2.jpg
Задачу не понял.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eugenillin

Судя по всему, дело в пути до текстового файла

Вот версия с графическим интерфейсом, можно выбрать пути:

Код:
#include <File.au3>
#include <GuiStatusBar.au3>


Global $sFolder1 = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path1', '')
Global $sFolder2 = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', '')
Global $sFile1 = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path3', '')

$hParent = GUICreate('Обработка файлов', 344, 323, -1, -1, -1)

$nButton0 = GUICtrlCreateButton('Запуск', 84, 200, 161, 89, 0)

$Input1 = GUICtrlCreateInput($sFolder1, 16, 44, 261, 24)
$Label1 = GUICtrlCreateLabel('Путь до начальной папки', 16, 24, 251, 20)
$nButton1 = GUICtrlCreateButton('...', 276, 43, 53, 25, 0)

$Input2 = GUICtrlCreateInput($sFolder2, 16, 94, 261, 24)
$Label2 = GUICtrlCreateLabel('Путь до конечной папки', 16, 74, 251, 20)
$nButton2 = GUICtrlCreateButton('...', 276, 93, 53, 25, 0)

$Input3 = GUICtrlCreateInput($sFile1, 16, 144, 261, 24)
$Label3 = GUICtrlCreateLabel('Путь до текстового файла', 16, 124, 251, 20)
$nButton3 = GUICtrlCreateButton('...', 276, 143, 53, 25, 0)

$hStatus = _GUICtrlStatusBar_Create($hParent)

GUISetState(@SW_SHOW, $hParent)
WinSetOnTop($hParent, '', 1)

While 1

	Switch GUIGetMsg()
		Case -3
			$sFolder1 = GUICtrlRead($Input1)
			$sFolder2 = GUICtrlRead($Input2)
			$sFile1 = GUICtrlRead($Input3)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path1', $sFolder1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', $sFolder2)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path3', $sFile1)
			Exit
		Case $nButton1
			WinSetOnTop($hParent, '', 0)
			$sFolder1 = FileSelectFolder('Исходные файлы', '')
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path1', $sFolder1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', $sFolder2)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path3', $sFile1)
			If Not @error Then GUICtrlSetData($Input1, $sFolder1)
			WinSetOnTop($hParent, '', 1)

		Case $nButton2
			WinSetOnTop($hParent, '', 0)
			$sFolder2 = FileSelectFolder('Исходные файлы', '')

			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', $sFolder2)
			If Not @error Then GUICtrlSetData($Input2, $sFolder2)
			WinSetOnTop($hParent, '', 1)

		Case $nButton3
			WinSetOnTop($hParent, '', 0)
			$sFile1 = FileOpenDialog('Текстовый файл', @ScriptDir & '\', 'Текстовые файлы (*.txt)', 1)

			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path3', $sFile1)
			If Not @error Then GUICtrlSetData($Input3, $sFile1)
			WinSetOnTop($hParent, '', 1)

		Case $nButton0
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$sFolder1 = GUICtrlRead($Input1)
			$sFolder2 = GUICtrlRead($Input2)
			$sFile1 = GUICtrlRead($Input3)

			_File_Rename($sFile1, $sFolder1, $sFolder2)

			MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
			_GUICtrlStatusBar_SetText($hStatus, '')

	EndSwitch

WEnd


Func _File_Rename($sFilePath, $sFolderPath_1, $sFolderPath_2)

	If $sFolder1 = '' Or $sFolder2 = '' Or $sFile1 = '' Then Return SetError(1, 0, 0)

	Local $aTemp

	_FileReadToArray($sFilePath, $aTemp)

	For $i = 1 To $aTemp[0]
		Assign($aTemp[$i], Eval($aTemp[$i]) + 1)
	Next

	Dim $uArray[$aTemp[0]][2] = [[0]]

	For $i = 1 To $aTemp[0]
		If Eval($aTemp[$i]) > 0 Then
			$uArray[0][0] += 1
			$uArray[$uArray[0][0]][0] = $aTemp[$i]
			$uArray[$uArray[0][0]][1] = Eval($aTemp[$i])
			Assign($aTemp[$i], -1)
		EndIf
	Next
	ReDim $uArray[$uArray[0][0] + 1][2]

	For $i = 1 To $uArray[0][0]
		ConsoleWrite($sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0] & @LF)
		ConsoleWrite($sFolderPath_1 & '\' & $uArray[$i][0] & @LF)
		FileCopy($sFolderPath_1 & '\' & $uArray[$i][0], $sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0]) ; копирование файлов
	Next

EndFunc   ;==>_File_Rename


Если этот вариант работает, то можно (и, скорее всего, нужно) сделать ввод имен файлов прямо в этом окне, без блокнота.

Например, так:
Код:
#include <File.au3>
#include <GuiStatusBar.au3>


Global $sFolder1 = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path1', '')
Global $sFolder2 = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', '')

$hParent = GUICreate('Обработка файлов', 540, 430, -1, -1, -1)

$nButton0 = GUICtrlCreateButton('Запуск', 284, 220, 161, 89, 0)

$Input1 = GUICtrlCreateInput($sFolder1, 216, 44, 261, 24)
GUICtrlCreateLabel('Путь до начальной папки', 216, 24, 251, 20)
$nButton1 = GUICtrlCreateButton('...', 476, 43, 53, 25, 0)

$Input2 = GUICtrlCreateInput($sFolder2, 216, 104, 261, 24)
GUICtrlCreateLabel('Путь до конечной папки', 216, 84, 251, 20)
$nButton2 = GUICtrlCreateButton('...', 476, 103, 53, 25, 0)

GUICtrlCreateLabel('Имена файлов', 16, 24, 151, 20)
$Edit1 = GUICtrlCreateEdit('', 4, 43, 200, 350)


$hStatus = _GUICtrlStatusBar_Create($hParent)

GUISetState(@SW_SHOW, $hParent)
WinSetOnTop($hParent, '', 1)

While 1

	Switch GUIGetMsg()
		Case -3
			$sFolder1 = GUICtrlRead($Input1)
			$sFolder2 = GUICtrlRead($Input2)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path1', $sFolder1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', $sFolder2)

			Exit
		Case $nButton1
			WinSetOnTop($hParent, '', 0)
			$sFolder1 = FileSelectFolder('Исходные файлы', '')
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path1', $sFolder1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', $sFolder2)
			If Not @error Then GUICtrlSetData($Input1, $sFolder1)
			WinSetOnTop($hParent, '', 1)

		Case $nButton2
			WinSetOnTop($hParent, '', 0)
			$sFolder2 = FileSelectFolder('Исходные файлы', '')

			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path2', $sFolder2)
			If Not @error Then GUICtrlSetData($Input2, $sFolder2)
			WinSetOnTop($hParent, '', 1)

		Case $nButton0
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$sFolder1 = GUICtrlRead($Input1)
			$sFolder2 = GUICtrlRead($Input2)
			$sFile1 = GUICtrlRead($Edit1)

			_File_Rename($sFile1, $sFolder1, $sFolder2)

			MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
			_GUICtrlStatusBar_SetText($hStatus, '')

	EndSwitch

WEnd


Func _File_Rename($sText, $sFolderPath_1, $sFolderPath_2)

	If $sFolder1 = '' Or $sFolder2 = '' Or $sText = '' Then Return SetError(1, 0, 0)

	$aTemp = StringRegExp($sText & @LF, '([^\r\n]*)(?:\r\n|\n|\r)(?:[\r\n]$)?', 3)

	For $i = 0 To UBound($aTemp) - 1
		Assign($aTemp[$i], Eval($aTemp[$i]) + 1)
	Next

	Dim $uArray[UBound($aTemp) - 1][2] = [[0]]

	For $i = 0 To UBound($aTemp) - 1
		If Eval($aTemp[$i]) > 0 Then
			$uArray[0][0] += 1
			$uArray[$uArray[0][0]][0] = $aTemp[$i]
			$uArray[$uArray[0][0]][1] = Eval($aTemp[$i])
			Assign($aTemp[$i], -1)
		EndIf
	Next

	ReDim $uArray[$uArray[0][0] + 1][2]

	For $i = 1 To $uArray[0][0]
		ConsoleWrite($sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0] & @LF)
		;ConsoleWrite($sFolderPath_1 & '\' & $uArray[$i][0] & @LF)
		FileCopy($sFolderPath_1 & '\' & $uArray[$i][0], $sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0]) ; копирование файлов
	Next

EndFunc   ;==>_File_Rename
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eugenillin
Да, там ошибочка обнаружилась, при переделке 1-го варианта во 2-й
Исправил.

Добавление расширения при вводе - в списке все файлы могут быть одного расширения или разных? Для переименования так-то расширение не нужно, это нужно только при копировании.
Там могут быть файлы с одинаковым именем, но разным расширением? - скрипт может просто найти файл по имени и скопировать с тем же расширением
 
Автор
E

eugenillin

Новичок
Сообщения
3
Репутация
0
Вот спасибо, WSWR !!
Отлично!! Я могу уже рекомендовать друзьям и коллегам? Добавьте тогда свой копирайт, данные..

В папке у меня все файлы одного расширения (изначально снимаю в RAF+jpg, но, сливая на комп, сразу сортирую их отдельно, и, в зависимости от задачи, работаю то с тем, то с тем. Больше с RAF.)

Когда вбивал имена без расширения, программа отрабатывала, но результата не было

P.S. Проверил, работает отлично! Благодарю!!
Но расширение требует. Значит, буду пользоваться первым вариантом, проще добавить пакетно, и префиксы и расширение, будет в текстовом редакторе

P.P.S. Пытался написать Вам в личку, не вышло.. :(
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
eugenillin
Вот с выбором расширения:
Код:
#NoTrayIcon

#include <File.au3>
#include <Constants.au3>
#include <GuiComboBox.au3>
#include <GuiStatusBar.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>

Opt('TrayMenuMode', 1 + 2)

Global $sFolder1 = IniRead(@ScriptDir & '\Settings.ini', 'Settings', 'Path1', '')
Global $sFolder2 = IniRead(@ScriptDir & '\Settings.ini', 'Settings', 'Path2', '')
Global $sComboString = IniRead(@ScriptDir & '\Settings.ini', 'Settings', 'AllExt', 'jpg|raf')
Global $sExt = IniRead(@ScriptDir & '\Settings.ini', 'Settings', 'Ext', 'jpg')

$hParent = GUICreate('Обработка файлов', 540, 430, -1, -1, -1)

$nButton0 = GUICtrlCreateButton('Запуск', 285, 240, 160, 90, 0)

$Input1 = GUICtrlCreateInput($sFolder1, 216, 44, 261, 24)
GUICtrlCreateLabel('Путь до начальной папки', 216, 24, 251, 20)
$nButton1 = GUICtrlCreateButton('...', 476, 43, 53, 25, 0)

$Input2 = GUICtrlCreateInput($sFolder2, 216, 104, 261, 24)
GUICtrlCreateLabel('Путь до конечной папки', 216, 84, 251, 20)
$nButton2 = GUICtrlCreateButton('...', 476, 103, 53, 25, 0)

GUICtrlCreateLabel('Имена файлов', 16, 24, 151, 20)
$Edit1 = GUICtrlCreateEdit('', 4, 43, 200, 350)


$Combo1 = GUICtrlCreateCombo($sExt, 285, 160, 160, 25, $CBS_DROPDOWN)
GUICtrlSetData(-1, StringRegExpReplace($sComboString, '(' & $sExt & '\|)' & '|' & '\|(' & $sExt & ')', ''))

$hStatus = _GUICtrlStatusBar_Create($hParent)

GUISetState(@SW_SHOW, $hParent)
WinSetOnTop($hParent, '', 1)

$tray2 = TrayCreateItem('Развернуть')
TrayCreateItem('')
$tray1 = TrayCreateItem('Выход')
TraySetClick(8)


While 1

	Switch GUIGetMsg()
		Case $GUI_EVENT_MINIMIZE
			GUISetState(@SW_HIDE, $hParent)
			Opt('TrayIconHide', 0)

		Case $GUI_EVENT_CLOSE
			WinSetOnTop($hParent, '', 0)
			If MsgBox(262144 + 1, 'Закрытие окна', 'Закрыть программу?') = 1 Then

				$sFolder1 = GUICtrlRead($Input1)
				$sFolder2 = GUICtrlRead($Input2)
				$sComboString = _GUICtrlComboBox_GetList(GUICtrlGetHandle($Combo1))
				$sExt = GUICtrlRead($Combo1)

				IniWrite(@ScriptDir & '\Settings.ini', 'Settings', 'Path1', $sFolder1)
				IniWrite(@ScriptDir & '\Settings.ini', 'Settings', 'Path2', $sFolder2)

				IniWrite(@ScriptDir & '\Settings.ini', 'Settings', 'AllExt', $sComboString)
				IniWrite(@ScriptDir & '\Settings.ini', 'Settings', 'Ext', $sExt)
				Exit
			EndIf
			WinSetOnTop($hParent, '', 1)

		Case $nButton1
			WinSetOnTop($hParent, '', 0)
			$sFolder1 = FileSelectFolder('Исходные файлы', '')
			IniWrite(@ScriptDir & '\Settings.ini', 'Settings', 'Path1', $sFolder1)

			If Not @error Then GUICtrlSetData($Input1, $sFolder1)
			WinSetOnTop($hParent, '', 1)

		Case $nButton2
			WinSetOnTop($hParent, '', 0)
			$sFolder2 = FileSelectFolder('Исходные файлы', '')

			IniWrite(@ScriptDir & '\Settings.ini', 'Settings', 'Path2', $sFolder2)
			If Not @error Then GUICtrlSetData($Input2, $sFolder2)
			WinSetOnTop($hParent, '', 1)

		Case $nButton0
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$sFolder1 = GUICtrlRead($Input1)
			$sFolder2 = GUICtrlRead($Input2)
			$sFile1 = GUICtrlRead($Edit1)
			$sExt = GUICtrlRead($Combo1)

			_File_Rename($sFile1, $sFolder1, $sFolder2, $sExt)

			_GUICtrlStatusBar_SetText($hStatus, '')

	EndSwitch

	Switch TrayGetMsg()
		Case $TRAY_EVENT_PRIMARYDOUBLE
			GUISetState(@SW_SHOWNOACTIVATE, $hParent)
			Opt('TrayIconHide', 1)
		Case $tray1
			WinSetOnTop($hParent, '', 0)
			If MsgBox(262144 + 1, 'Закрытие окна', 'Закрыть программу?') = 1 Then Exit
			WinSetOnTop($hParent, '', 1)
		Case $tray2
			GUISetState(@SW_SHOWNOACTIVATE, $hParent)
			Opt('TrayIconHide', 1)
	EndSwitch

WEnd


Func _File_Rename($sText, $sFolderPath_1, $sFolderPath_2, $sExt)

	If $sFolder1 = '' Or $sFolder2 = '' Or $sText = '' Then Return SetError(1, 0, 0)

	$aTemp = StringRegExp($sText & @LF, '([^\r\n]*)(?:\r\n|\n|\r)(?:[\r\n]$)?', 3)

	For $i = 0 To UBound($aTemp) - 1
		Assign($aTemp[$i], Eval($aTemp[$i]) + 1)
	Next

	Dim $uArray[UBound($aTemp) - 1][2] = [[0]]

	For $i = 0 To UBound($aTemp) - 1
		If Eval($aTemp[$i]) > 0 Then
			$uArray[0][0] += 1
			$uArray[$uArray[0][0]][0] = $aTemp[$i]
			$uArray[$uArray[0][0]][1] = Eval($aTemp[$i])
			Assign($aTemp[$i], -1)
		EndIf
	Next

	ReDim $uArray[$uArray[0][0] + 1][2]

	For $i = 1 To $uArray[0][0]
		ConsoleWrite($sFolderPath_1 & '\' & $uArray[$i][0] & '.' & $sExt & ' ==> ' & $sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0] & '.' & $sExt & @LF)
		FileCopy($sFolderPath_1 & '\' & $uArray[$i][0] & '.' & $sExt, $sFolderPath_2 & '\' & $uArray[$i][1] & '=' & $uArray[$i][0] & '.' & $sExt) ; копирование файлов
	Next
	
	MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
	
EndFunc   ;==>_File_Rename

Можно вписывать новые расширения
 
Автор
E

eugenillin

Новичок
Сообщения
3
Репутация
0
WSWR
Класс!
То, что надо!!
Спасибо большущее!!!
 
Верх