Página 1 de 1

Modificador de nombres masivo

Publicado: 12 Abr 2010, 03:53
por jonathan7
Bueno cree esta aplicación como mi solución a que el programa mp3resizer me agregaba una extensión a los mp3 que comprimía en bitrate y cuando tienes mas de 30 archivos asi molesta re nombrarlos uno por uno tiene algunas funciones utiles que le podrán servir a otros les dejo el code:

Código: Seleccionar todo

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=busqueda.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Description=Elimina cualquier texto dentro de un archivo en masa
#AutoIt3Wrapper_Res_Fileversion=2.0.0.4
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_Field=Creador|Jonathan Palomino Vilca
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>
#Include <File.au3>
#Include <GuiToolTip.au3>
Global $CABECERA = "Archivo inicial                         |Direccion inicial                  |Archivo Final                          |Direccion Final                                      "
Global $ITEMID,$Lista1,$DIRECCION,$DIRE,$Musicdiv,$i,$GADROPFILES[1]
Global Const $WM_DROPFILES = 563
#Region ### START Koda GUI section ### Form=C:\autoit\koda_1.7.2.0\Forms\quitar extensiones.kxf
$Form1 = GUICreate("Quitar extensiones", 842, 455, 118, 97, -1, BitOR($WS_EX_ACCEPTFILES,$WS_EX_WINDOWEDGE))
$BTNPROCEDER = GUICtrlCreateButton("Proceder", 232, 360, 75, 25, $WS_GROUP)
GUICtrlSetState(-1, $GUI_DISABLE)
$SALIR = GUICtrlCreateButton("Salir", 376, 360, 75, 25, $WS_GROUP)
$Label1 = GUICtrlCreateLabel("Seleccionar Carpeta", 48, 24, 100, 17)
$ABRIR = GUICtrlCreateButton("Abrir", 216, 20, 75, 25, $WS_GROUP)
GUICtrlSetState(-1, $GUI_DISABLE)
$Label2 = GUICtrlCreateLabel("Extension a eliminar", 48, 64, 97, 17)
$EXTENCION = GUICtrlCreateInput("", 216, 62, 73, 21)
_LISTADO()
$Progress1 = GUICtrlCreateProgress(24, 400, 790, 24)
$Label3 = GUICtrlCreateLabel("Seleccionar Archivos", 363, 21, 104, 17)
$Button4 = GUICtrlCreateButton("Abrir", 531, 17, 75, 25, $WS_GROUP)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button5 = GUICtrlCreateButton("Borrar todo", 512, 360, 75, 25, $WS_GROUP)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button6 = GUICtrlCreateButton("Borrar elegido", 656, 360, 75, 25, $WS_GROUP)
GUICtrlSetState(-1, $GUI_DISABLE)
$Label4 = GUICtrlCreateLabel("0", 760, 432, 18, 17)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC") ;;; agregar archivos de fuera
#EndRegion ### END Koda GUI section ###

While 1

	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ABRIR
			$DIRECCION = FileSelectFolder("Seleccionar carpeta a agregar", "")
			If Not ($DIRECCION = "") Then AGREGAR($DIRECCION, 0)
			BORRARDUPLICADOS()
			GUICtrlSetData($Progress1, 0)
		Case $BTNPROCEDER

			For $i=0 To _GUICTRLLISTVIEW_GETITEMCOUNT($Lista1) -1
			If _GUICtrlListView_GetItemText($Lista1,$i,0) = ELIMINAREXTENCION(_GUICtrlListView_GetItemText($Lista1,$i,2)) Then
				$CONTROL=0
			Else
				$CONTROL =1
			EndIf
			_RENOMBRAR(_GUICtrlListView_GetItemText($Lista1,$i,1),ELIMINAREXTENCION(_GUICtrlListView_GetItemText($Lista1,$i,2)),$CONTROL)
			GUICtrlSetData($Label4,($i+1))
			GUICtrlSetData($Progress1, 100 /_GUICTRLLISTVIEW_GETITEMCOUNT($Lista1)*($i+1))
			Next

		Case $Button4
			AGREGARALISTA()
			GUICtrlSetData($Progress1, 0)
		Case $SALIR
			Exit
		Case $EXTENCION
			GUICtrlSetState($BTNPROCEDER, $GUI_ENABLE)
			GUICtrlSetState($ABRIR, $GUI_ENABLE)
			GUICtrlSetState($Button4, $GUI_ENABLE)
			GUICtrlSetState($Button5, $GUI_ENABLE)
			GUICtrlSetState($Button6, $GUI_ENABLE)
		Case $GUI_EVENT_DROPPED
			EVENTOJALAR()
		Case $Button5
			_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($Lista1))
			GUICtrlSetData($Progress1, 0)
			GUICtrlSetData($Label4,0)
		Case $Button6
			$ELIMINADO = _GUICtrlListView_GetSelectedCount($Lista1)
			_GUICTRLLISTVIEW_DELETEITEMSSELECTED(GUICtrlGetHandle($Lista1))
			GUICtrlSetData($Label4,($i)-$ELIMINADO)
		If _GUICtrlListView_GetItemText($Lista1, 0) = '' Then _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($Lista1))
	EndSwitch
WEnd

Func AGREGAR($DIRECCION, $MAINF)
	If $MAINF =2 Then
	$Musicdiv = StringSplit($DIRECCION, '\')

	$ITEMID = _GUICTRLLISTVIEW_ADDITEM($Lista1, $Musicdiv[$Musicdiv[0]], -1, 0) ;;;Nombre
	_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, $DIRECCION, 1)   ;;;Direccion
	_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, ELIMINAREXTENCION($Musicdiv[$Musicdiv[0]]), 2)
	_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, StringReplace($DIRECCION,ELIMINAREXTENCION($Musicdiv[$Musicdiv[0]]),"") & ELIMINAREXTENCION($Musicdiv[$Musicdiv[0]]), 3)
	UBICARDUPLICADO($ITEMID)

	Else

		$SEARCH = FileFindFirstFile($DIRECCION & "\*.*")    ;;; este da los archivos de la presente carpeta
		While 1
			$FILE = FileFindNextFile($SEARCH)
			If @error Then ExitLoop
			$ATTRIB = FileGetAttrib($DIRECCION & "\" & $FILE)
			If Not StringInStr($ATTRIB, "D") Then
				$ITEMID = _GUICTRLLISTVIEW_ADDITEM($Lista1, $FILE, -1, 0)   ;; nombre
				_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, $DIRECCION  &"\"& $FILE, 1)  ;; direccion
				_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, ELIMINAREXTENCION($FILE), 2)
				_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, $DIRECCION  &"\"&ELIMINAREXTENCION($FILE), 3)
				UBICARDUPLICADO($ITEMID)

			EndIf
		WEnd
		FileClose($SEARCH)

		$SEARCH = FileFindFirstFile($DIRECCION & "\*.*")    ;;;;   Este da las carpetas
		While 1
			$FILE = FileFindNextFile($SEARCH)
			If @error Then ExitLoop
			$ATTRIB = FileGetAttrib($DIRECCION & "\" & $FILE)
			If StringInStr($ATTRIB, "D") Then
				UBICARDUPLICADO($ITEMID)
				$SUBTEMP = $DIRECCION & "\" & $FILE
				AGREGAR($SUBTEMP, $MAINF)
				UBICARDUPLICADO($ITEMID)
			EndIf
		WEnd
		FileClose($SEARCH)

	EndIf
EndFunc

Func _LISTADO()
	$Lista1 = GUICtrlCreateListView($CABECERA, 24, 104, 786, 214, $LVS_NOSORTHEADER, $WS_EX_CLIENTEDGE)
GUICtrlSetState($Lista1, $GUI_DROPACCEPTED)
_GUICTRLLISTVIEW_SETEXTENDEDLISTVIEWSTYLE($Lista1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_INFOTIP))  ;;;, $LVS_EX_TRACKSELECT
Local $HTOOLTIP = _GUICTRLLISTVIEW_GETTOOLTIPS($Lista1)
	If IsHWnd($HTOOLTIP) Then
		WinSetOnTop($HTOOLTIP, "", 1)
		_GUITOOLTIP_SETDELAYTIME($HTOOLTIP, 3, 60)
	EndIf
EndFunc

Func BORRARDUPLICADOS()
	Local $K, $D, $N, $DECISION = 0
	$N = _GUICTRLLISTVIEW_GETITEMCOUNT($Lista1) ;;Tamaño de la lista comiensa segun numero
	For $K = 1 To $N
		$D = _GUICTRLLISTVIEW_GETITEMPARAM($Lista1, $N - $K)
		If $D = 2 Then
			If $DECISION = 0 Then
				$DECISION = MsgBox(262148, "Duplicado encontrado", "El archivo que agrego ya existe ¿desea eliminarlo?")
			EndIf
			If $DECISION = 6 Then
				GUICtrlSendMsg($Lista1, 4104, $N - $K, 0)

			EndIf
		EndIf
	Next
EndFunc

Func UBICARDUPLICADO($ELEMENTO)

	Local $NIT, $K, $AA, $BB
	$NIT = _GUICTRLLISTVIEW_GETITEMCOUNT($Lista1)  ;;;;Tamaño de la lista comiensa segun numero
	$NOMBRE1 = _GUICTRLLISTVIEW_GETITEMTEXT($Lista1, $ITEMID, 0)
	$DIRECCION1 = _GUICTRLLISTVIEW_GETITEMTEXT($Lista1, $ITEMID, 1)
	For $K = 0 To $NIT - 1
		If Not ($K = $ELEMENTO) Then
			If _GUICTRLLISTVIEW_GETITEMTEXT($Lista1, $K, 0) = $NOMBRE1 Then
				If _GUICTRLLISTVIEW_GETITEMTEXT($Lista1, $K, 1) = $DIRECCION1 Then
					_GUICTRLLISTVIEW_SETITEMPARAM($Lista1, $ITEMID, 2)

				EndIf

			EndIf
		EndIf
	Next
EndFunc

Func AGREGARALISTA()
$Music = FileOpenDialog('Añadir archivos', '', 'Cualquier Archivo (*.*)', 5, '', $Form1)
If not @error Then
			$Musicdiv = StringSplit($Music, '|') ;Divido en variables la ruta anteriormente dada por $Music dependiendo de '|'
		If $Musicdiv[0] <> 1 Then ;Si el valor es diferente a 1 entonces
			For $N = 2 To $Musicdiv[0] ;Añadir varios archivos
				$ITEMID = _GUICtrlListView_AddItem($Lista1, $Musicdiv[$N])
				_GUICtrlListView_AddSubItem($Lista1, $ITEMID, $Musicdiv[1]  &"\"& $Musicdiv[$N], 1)
				_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, ELIMINAREXTENCION($Musicdiv[$N]), 2)
				_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, $Musicdiv[1]  &"\"&ELIMINAREXTENCION($Musicdiv[$N]), 3)
				UBICARDUPLICADO($ITEMID)
			Next
		Else
			$Musicdiv = StringSplit($Music, '\') ;Añadir un archivo
			$ITEMID = _GUICtrlListView_AddItem($Lista1, $Musicdiv[$Musicdiv[0]])
			_GUICtrlListView_AddSubItem($Lista1, $ITEMID, $Music, 1)
			_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, ELIMINAREXTENCION($Musicdiv[$Musicdiv[0]]), 2)
			$DIRE = StringReplace($Music,  $Musicdiv[$Musicdiv[0]], "")
			_GUICTRLLISTVIEW_ADDSUBITEM($Lista1, $ITEMID, $DIRE  &ELIMINAREXTENCION($Musicdiv[$Musicdiv[0]]), 3)
			UBICARDUPLICADO($ITEMID)
		EndIf

	BORRARDUPLICADOS()
	EndIf
EndFunc


Func ELIMINAREXTENCION($DATO)

	If GUICtrlRead($EXTENCION) = "" Then
		Return $DATO
		EndIf

$text = StringReplace($DATO, GUICtrlRead($EXTENCION), "")

Return $text

EndFunc

Func _RENOMBRAR($NOMBREORIGEN,$NUEVONOMBRE,$con)
	If $con =1 Then _FileRename($NOMBREORIGEN,$NUEVONOMBRE) ;;controlar que no se envia lo mismo

	EndFunc

Func WM_DROPFILES_FUNC($HWND, $MSGID, $WPARAM, $LPARAM)  ;;; funcion evento para jalar
	Local $NSIZE, $PFILENAME
	Local $NAMT = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $WPARAM, "int", -1, "ptr", 0, "int", 255)
	For $I = 0 To $NAMT[0] - 1
		$NSIZE = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $WPARAM, "int", $I, "ptr", 0, "int", 0)
		$NSIZE = $NSIZE[0] + 1
		$PFILENAME = DllStructCreate("char[" & $NSIZE & "]")
		DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $WPARAM, "int", $I, "ptr", DllStructGetPtr($PFILENAME), "int", $NSIZE)
		ReDim $GADROPFILES[$I + 1]
		$GADROPFILES[$I] = DllStructGetData($PFILENAME, 1)
		$PFILENAME = 0
	Next
EndFunc

Func EVENTOJALAR()
	For $I = 0 To UBound($GADROPFILES) - 1
		$DIRECCION = $GADROPFILES[$I]
		If StringInStr(FileGetAttrib($DIRECCION), "D") Then
			AGREGAR($DIRECCION,0) ;;; 0 para carpeta
		Else
			AGREGAR($DIRECCION,2)
		EndIf
	Next
	BORRARDUPLICADOS()
EndFunc

Obviamente si lo usan dejar los creditos jeje
aqui las direcciones del code complidado

http://www.4shared.com/file/PH9HqbEq/gu ... rando.html
http://www.4shared.com/file/CThFZxn5/gu ... ncion.html

Re: Modificador de nombres masivo

Publicado: 19 May 2010, 23:18
por Rupert.25
Saludos.
,
Muchas gracias por compartir tu código. Será de mucha utilidad.

En lo que respecta al Test, me arroja un error en la linea 227 en la funcion "_FileRename", no sé si lo tengas en un au3 diferente por que AutoIt no incluye esa funcióon. A menos que yo tenga una version bastabte atrasada.

Gracias por todo!

Disculpa por la espectacular demora

Publicado: 06 Oct 2010, 18:30
por jonathan7
ante todo disculparme por no haber previsto que los demas usuarios no tengan esa funcion, esta funcion _FileRename no es oficial la arme yo para mi uso y la adjunte a mi archivo File.au3 te adjunto el codigo solo tienes que agregarlo al final del mencionado arhivo file.au3

Código: Seleccionar todo

;===============================================================================
; Description:        Cambiar de nombre un archivo
; Syntax:           _FileRename( $file,$NewName)
; Parameter(s):     $file - The path of file to change his name
;                $NewName - New name of the file
; Requirement(s):   None
; Return Value(s):  funciono retorna 1
;                   fallo retorna 0
; Country:         Peru
; Author(s):        Jonathan
; Note(s):          None
;===============================================================================

Func _FileRename($file,$NewName)
   Local $paht,$name,$a=0
   If FileExists($file) Then
	   Do
		  $paht=Stringmid($file,Stringlen($file)-$a,1)
		  $a+=1
	   Until $paht="\"

	   $paht=Stringmid($file,1,Stringlen($file)-$a)
	   $name=StringRight($file,$a-1)
	   $result = Run(@ComSpec & ' /c RENAME "' & $name & '" "' & $NewName & '"',$paht,@SW_HIDE, 6)

	   While 1
		  $line = StderrRead($result)
		  If @error Then ExitLoop
		  ConsoleWriteError("! _FileRename  Error:" &  @cr & "-->" & $line & @cr)
		  Return $line
	  Wend
	  Return 1
  Else
	  Return 0
  EndIf
EndFunc   ;==>_FileRename

Re: Modificador de nombres masivo

Publicado: 07 Oct 2010, 09:40
por Ximorro
¿Por qué no usas FileMove para hacer un Rename?

A parte, no es bueno hacer versiones modificadas de las udf oficiales, puede ser un problema luego para distribuirlas, y también cuando actualices AutoIt puedes perder los cambios...
Es mejor guardar esas extensiones en udfs personales, o simplemente en el programa que las usa.
Sólo es un consejo...