Página 1 de 1

Renombrador masivo

Publicado: 23 Mar 2010, 06:52
por avechuche
Bueno, yo de nuevo .. resulta que quiero hacer un renombrador masivo... digamos tengo una carpeta con "x" cantidad de archivos o carpetas a los cuales le quiero cambiar de nombre. Y tengo un ".txt" aparte con los nombres que les quiero poner a esos archivos/carpetas. A considerar. Que si la cantidad de archivos o carpetas es diferente a la cantidad de nombres del ".txt" (un nombre por linea), que el programa no haga nada. Tengo el siguiente codigo pero no me funciona :S. a ver si me pueden ayudar ...

Código: Seleccionar todo

#include <file.au3>

$carpeta = @ScriptDir & "\gonzalo\" ;
$txt = "nombres.txt" ; 

$total_lineas = _FileCountLines($txt)
$total_archivos = _FileListToArray($carpeta)

If $total_lineas = $total_archivos[0] Then
	For	$s = 1 To $total_lineas
		$linea = FileReadLine($txt, $s)
		FileMove($linea, "nuevo_nombre_" & $s, 1)
	Next
EndIf
No se que tengo mal... Gracias!

Re: Renombrador masivo

Publicado: 23 Mar 2010, 22:43
por Chefito
Que error te da?
Puedes comprobar si alguna función te da error con @error.
Mira a ver si entra en el if. Puede que sin querer tengas más líneas que archivos por culpa de un salto de línea o un retorno de carro.
Ten cuidado con los path de los archivos no sea que alguna función lo necesite.

Saludos.

Re: Renombrador masivo

Publicado: 24 Mar 2010, 02:18
por avechuche
Osea error ninguno, no me renombra las cosas :S

Re: Renombrador masivo

Publicado: 24 Mar 2010, 08:33
por gna08
Jajaja te viniste al foro, Jajaja, bue estoy casi seguro q el error es el siguiente, en la línea el txt sólo aparece el nombre del archivo a renombrar, entonces al usar la función filemove y leer el nombre y al no especificarse la ruta del mismo pues usa la carpeta del script en este caso, y como cálculo que al script lo estas ejecutando en una carpeta diferente a la de los archivos, al buscar era línea para mover, no la encuentra,
a ver si usas la lógica y pensás donde va lo que te acabó de explicar.
Saludos

Re: Renombrador masivo

Publicado: 24 Mar 2010, 09:46
por Ximorro
Totalmente de acuerdo con lo del path, pero además lo estás haciendo al revés.
En FileMove usas de origen los nombres en el archivo txt, con lo que estás usando esos nombres como los que hay que cambiar, no como los nombres A los que hay que cambiar...

Al primer nombre en nombres.txt lo renombras como "nuevo_nombre_1", pero si en \Gonzalo (suponiendo que encuentras el path) no hay ningún archivo con ese nombre no lo cambiará...

Re: Renombrador masivo

Publicado: 12 Abr 2010, 03:19
por avechuche

Código: Seleccionar todo

#include <file.au3>


$txt = @ScriptDir&"\nombres\nombres.txt"
$abrirtxt = FileOpen($txt, 0)
$cantlineastxt = _FileCountLines($txt)
$archivos = @ScriptDir&"\archivos\"
$destino = @ScriptDir&"\Copias\"


	For	$s = 1 To $cantlineastxt
		$linea = FileReadLine($abrirtxt, $s)
		FileMove($archivos&"***"&".***", $destino&$linea&".***")
	Next
Sigo con el problemita este ... creo que me falta un poco nada mas .. como le indico al autoit que el la primera linea q lee del .txt ($txt) es el nombre que le debe poner al primer archivo que encuentra dentro de "$archivos" y asi sucesivamente, el 2 con el 2, etc etc etc ... gracias!

Respuesta posible

Publicado: 12 Abr 2010, 03:41
por jonathan7
Por que no pruebas con _FileRename() esta en este foro es una actualizacion a la libreria file si no lo encuentras te lo dejo.

Código: Seleccionar todo

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
Con esto no tendrás que mover nada usaras la dirección del archivo original y le pondrás el nuevo nombre que esta en tu .txt
$file = es la direccion path
$NewName = nuevo nombre

por ejemplo si la direccion del archivo original es $file ="C:\uno.txt" y el $NewName = "dos.txt"
terminara con "C:\dos.txt"

Re: Renombrador masivo

Publicado: 12 Abr 2010, 03:48
por avechuche
Ibamos bien hasta aca ...
"por ejemplo si la direccion del archivo original es $file ="C:\uno.txt" y el $NewName = "dos.txt"
terminara con "C:\dos.txt"... lo que yo quiero es lo siguiente ...
Supongamos que tengo una carpeta que tiene 10 archivos (10 archivos diferentes conm cualquier nombre) y tengo un (.txt) con 10 lineas (son los nombres que le quiero poner a esos 10 archivos). Quiero lo siguiente, que lea la primer linea del .txt y ponga eso al primer archivo. Ejemplo

Tengo 2 fotos (foto1.jpg y foto2.jpg) y en el archivo de texto q se llama (nombres.txt) tengo en la primer linea "autos" y en la segunda "perros". Entonces ... quiero que mi archivo "foto1.jpg" pase a llamarse "autos" y la "foto2.jpg" pase a llamarse "perros"

Re: Renombrador masivo

Publicado: 12 Abr 2010, 18:57
por Chefito
Para conseguir los nombres de archivos de un directorio puedes utilizar la función FileFindFirstFile. Mira su ejemplo y adaptalo un poquito para renombrar los archivos. También puedes utilizar la función _FileListToArray. Esta función almacena los nombres de los archivos en un array (matriz).

Ves cogiendo las líneas del archivo y los nombres de los archivos a cambiar de la carpeta, y cambiale el nombre uno a uno con un simple bucle for o while.

Saludos.

Re: Renombrador masivo

Publicado: 13 Abr 2010, 08:41
por Ximorro
Y ojo con eso de "el primer archivo". No hay nada en la ayuda que indique que esto ordene de alguna manera especial. Por pruebas que hice parece que lo ordenaba alfabéticamente, pero no puedes estar seguro si en la ayuda no lo especifican.
También tienes que tener cuidado porque también te devuelve directorios, aunque eso lo puedes arreglar con la máscara, si pones "*.*" normalmente no saldrán directorios, porque no tienen extensión (aunque tampoco saldrán archivos que no tengan extensión).

Para asegurarse del todo se podría usar FileGetAttrib, que entre otras cosas te dirá si es directorio. Quizás haya otra función más directa pero no la conozco.

Re: Renombrador masivo

Publicado: 14 Abr 2010, 10:22
por avechuche
Lo logre ... gracias por su ayuda ... estoy mejorando para que tmb renombre carpetas ...