Copia inteligente

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
Esgrimidor
Hacker del Foro
Mensajes: 286
Registrado: 19 Oct 2008, 00:59
Ubicación: Santa Cruz de Tenerife
Contactar:

Copia inteligente

Mensaje por Esgrimidor »

Tema a resolver :
Tengo una carpeta en mi PC, con diferentes accesos directos a archivos que estan en diferntes ubicaciones de mis discos duros.
Lo que quiero hacer es tener algun programa o nose si existe alguna forma de hacerlo es:
Con algun sencillo paso o aplicacion, copiar todos esos archivos a otra carpeta.
No copiar los accesos ! sino copiar los archivos a los que se refiere el acceso directo.

Mis suposiciones :
Los archivos windows shortcuts o accesos directos tienen la extensión .lnk . El script debería poder interpretar el destino del .lnk . O sea a qué archivo apunta o redirecciona.

Podría consistir en un proceso de copia donde el script escanea la carpeta a copiar en busca de archivos normales y de dichos accesos directos, pero en lugar de copiar el .lnk , copiar el archivo o carpeta al que apunta.
Este último paso de copia de carpeta destino prefijada por un acceso directo tiene la complicación adicional de que dicha carpeta puede contener otros accesos directos.
¿ Es capaz AutoIt de hacer un trabajo así y cómo ?. Bajo windows xp pro.

Su Utilidad :
En mi caso construyo carpetas sobre asuntos o expedientes que contienen subcarpetas y archivos, así como accesos directos a otras carpetas y archivos.
Dichos accesos directos pueden apuntar al mismo disco duro, a otro, a una unidad en red.....
Lo que necesito es crear una carpeta recopilatoria en un llavero usb, cd, dvd, o unidad de disco externa.


No es moco de pavo para los todopoderosos artífices de autoit.
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Copia inteligente

Mensaje por BasicOs »

Tema a resolver :
Tengo una carpeta en mi PC, con diferentes accesos directos a archivos que estan en diferntes ubicaciones de mis discos duros.
Lo que quiero hacer es tener algun programa o nose si existe alguna forma de hacerlo es:
Con algun sencillo paso o aplicacion, copiar todos esos archivos a otra carpeta.
No copiar los accesos ! sino copiar los archivos a los que se refiere el acceso directo.
Igual que en el ms dos o el cmd, es como poner el comando de Autoit copy pero es: FileCopy(origen,destino,si sobreescribe o no)
Mis suposiciones :
Los archivos windows shortcuts o accesos directos tienen la extensión .lnk . El script debería poder interpretar el destino del .lnk . O sea a qué archivo apunta o redirecciona.

Podría consistir en un proceso de copia donde el script escanea la carpeta a copiar en busca de archivos normales y de dichos accesos directos, pero en lugar de copiar el .lnk , copiar el archivo o carpeta al que apunta.
Este último paso de copia de carpeta destino prefijada por un acceso directo tiene la complicación adicional de que dicha carpeta puede contener otros accesos directos.
¿ Es capaz AutoIt de hacer un trabajo así y cómo ?. Bajo windows xp pro.
AUTOIT es 100% recursivo puedes llamar a una funcion desde la misma función y seguir profundizando en la red de carpetas. (hay muchos programas de este tipo en el foro, busca en el foro fichero,carpetas, recursivo, filefindNext, filecopy, filemove, etcc..
Su Utilidad :
En mi caso construyo carpetas sobre asuntos o expedientes que contienen subcarpetas y archivos, así como accesos directos a otras carpetas y archivos.
Dichos accesos directos pueden apuntar al mismo disco duro, a otro, a una unidad en red.....
Lo que necesito es crear una carpeta recopilatoria en un llavero usb, cd, dvd, o unidad de disco externa.
La clave de todo es _FileListToArray o con el FileFindNext, que son dos maneras de acceder a los nombres de las estructuras de carpetas.
Y el FileGetShortcut() que te consigue la ruta de los ficheros que conseguiste con la funcion anterior pero que son .lnk,



http://www.emesn.com/autoitforum/viewto ... File#p9865

Busqueda: http://www.emesn.com/autoitforum/search ... ndNextFile
También puedes buscar: _FileListToArray($_carpetaalistar, "*.lnk")

Basandome en el code de Alastor que tiene publicado en el enlace anterior le haríamos un minusculo cambio que sería en vez de ejecutar copiar, con lo que cambiamos la linea marcada con un ; con la que hace la copia.
No funciona como te lo publico, sino que es un DRAFT o ANALISIS del diseño que hay que hacer, despues de personalizarlo para tus necesidades te funcionara sin problemas.
Con este comando sacaremos el destino del enlace de los ficheros $detalles = FileGetShortcut(@DesktopDir & "\Shortcut Test.lnk")
La función ExecuteFolderLinks puedes llamarla copiar en vez de ejecutar:
#include <File.au3>
#include <Array.au3>

; Opciones AutoIt
Opt("WinTitleMatchMode", 4)
Opt("TrayIconHide", 0)

ExecuteFolderLinks(@DesktopCommonDir & "\")

ExecuteFolderLinks(@DesktopDir & "\")


Func ExecuteFolderLinks($_Folder)

$FileList = _FileListToArray($_Folder, "*.lnk")

If @error Then
MsgBox(0, "Error", "Se ha producido un error en la funcion _FileListToArray." & @CRLF & "Linea " & @ScriptLineNumber)
Return -1
EndIf

For $A = 1 To $FileList[0]
; ShellExecute($_Folder & $FileList[$A])
; o bien con la función:
if extensión del fichero es lnk then
; Read in the path of a shortcut
$detalles = FileGetShortcut(@DesktopDir & "\Shortcut Test.lnk")
; si queremos mover FileMove(@TempDir & "\*.txt", @TempDir & "\TxtFiles\", 9)
FileCopy( $detalles[0], "C:\nuevaruta\"& $detalles[0], 8)
else
FileCopy("C:\Temp\*.txt", "C:\Temp\TxtFiles\", 8)
endif
Next

EndFunc ;==>ExecuteFolderLinks
Ninguna aplicación es un imposible con Autoit, tiene potencia sobrada para hacer lo que hace cualquier otro lenguaje con sencillez,
¿No se si otro forero tiene hecha otra aplicación parecida a la que comenta el compañero?

Si en vez de modificar el de Alastor, puedes modificar el programa de KAFU:
Aquí tienes un programa buscador de ficheros profesional en Autoit que haría lo que tu necesitas solo añadienlo una opción del menú que dijera encontrar .lnk y mostrar el contenido de la función FileGetShortcut en la lista que saca. Si lo modificas puedes tener un programa buscador impresionante como se ve en las pantallas. ES GRATIS Y CODIGO abierto, solo hay que cambiar unas pocas lineas de código.

La modificación más concreta sería tocar el codigo que hace la acción copiar para personalizarla:
Donde hay un Filecopy añadir IF EL_FICHERO TERMINA EN LNK THEN COPIAR EL CONTENIDO DEL DESTINO DEL .LNK

Hay una linea del código que puede ser, o en todos los otros:
if se cumple esto then
If Not FileCopy("\\?\" & $aSelected[$i][0], "\\?\" & $s_target_file_name, $i_overwrite_files) Then
else
se copia el DESTINO del .lnk no el link.
endif



Realmente merece la pena ya que el codigo del programa BUSCADOR es superior Y super cómodo una vez que funcione.
http://www.emesn.com/autoitforum/viewto ... f=4&t=2531
Imagen
Salu22:)
Avatar de Usuario
Esgrimidor
Hacker del Foro
Mensajes: 286
Registrado: 19 Oct 2008, 00:59
Ubicación: Santa Cruz de Tenerife
Contactar:

Re: Copia inteligente

Mensaje por Esgrimidor »

Estupendo. Todavía no estoy preparado para programar.


Pero hay una complicación.
Imagina que la carpeta 1 que tengo que copiar a la carpeta 2 contiene varios accesos directos a carpetas y varios accesos directos a archivos.
AutoIt necesaria aplicar "medidas inteligentes" si se diera el caso de que un acceso directo a la carpeta 1 estuviera dentro de esa carpeta.

A mí me bastaría el siguiente script sencillito.
Con el procedimiento habitual copio la carpeta 1 a la carpeta 2.

Luego reviso lo que he hecho y me gustaría poder seleccionar un icono de acceso directo o grupo y con el botón derecho seleccionar la opción que lo convierta en el archivo original (esta vez dentro de la carpeta 2). De esta manera quizá sea más sencillo.

Saludos cordiales
pepe
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Copia inteligente

Mensaje por BasicOs »

La inteligencia en este caso no es tanta IA. ya que nos basamos en un SENCILLO IF .. THEN ELSE, O sea, en español, si sucede que es un .lnk, hacemos un tipo de copia, si no sucede esto hacemos la copia normal. O sea que si es blanco vamos a la derecha (codigo escrito), y si es negro (vamos a otro código).


Con una linea de comando puedes crear una función de copia especial que es lo quieres:

Código: Seleccionar todo

FUNC FileCopyespecial(origen,destino, sobreescribe)


if no es un link (ver funcion que nombré antes) THEN FileCopy(origen,destino,sobreescribe)
if  es un link THEN  filecopy(FileGetShortcut(origen) ,destino+nombre FileGetShortcut(origen), sobreescribe)
ENDFUNC
Y luego puedes hacer la lista de archivos a trabajar con _FileListToArray(), y esa lista pasar la por la función FileCopyEspecial con un

Código: Seleccionar todo

FOR .. REVISO TODO EL ARRAY
FileCopyEspecial
NEXT.
  1. Resumiendo: En 3 puntos:
    Punto 1: crear la función copiaESPECIALconlnk,
    punto 2: crear la lista de ficheros recursivamente. En una variable Array preferiblemente
    punto 3 pasar la lista de por un bucle FOR/NEXT.


Por cierto modifiqué el post anterior añadiendo algunos datos por si te interesa aprender los trucos de la creación de programas para tu caso particularmente.
Suerte con los 3 puntos creo que no vas a tener ningún problema en crearlos
Salu22:)

Si alguien tiene algún programa así puede mostrarlo, pero creo que un rato puedes crear tu propio programa copiador personalizado.
Avatar de Usuario
Esgrimidor
Hacker del Foro
Mensajes: 286
Registrado: 19 Oct 2008, 00:59
Ubicación: Santa Cruz de Tenerife
Contactar:

Re: Copia inteligente

Mensaje por Esgrimidor »

En lo de arriba de recursivo creo que no me supe explicar bien.

si dentro de la carpeta a copiar tienes un acceso directo de la carpeta a copiar lo que producirá en la copia será un rebosamiento. Porque en la carpeta 2 seguirá copiando la carpeta 1 hasta el infinito.
Creo que se soluciona rápidamente teniendo en cuenta la excepción.

Deja ver. En programación ya sabemos que se pueden hacer muchas cosas. Ya sabiendo que se puede hacer lo que me conviene es un programita ya hecho y sin problemas de configuración. Pero si no quedara más remedio me pondría manos a la obra.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Copia inteligente

Mensaje por Ximorro »

Efectivamente hacer la copia recursiva de un árbol de directorios no es complicado, y BasicOS ya te indica algunos códigos que han salido en el foro, y buscando es fácil encontrar más.
Hay que decir que AutoIT tiene capacidades limitadas de recursividad: el máximo número de llamadas recursivas en curso es 5100.
En este caso la recursividad se podría evitar almacenando en un array las carpetas que nos faltan por analizar, cada vez que te encuentras una la añades al array, cuando acabas con la carpeta actual vas al array a ver si hay carpetas por analizar y tomas la siguiente (en informática en lo que llamamos una estructura de pila).
Lo de copiar el archivo referenciado en vez del acceso directo también está solucionado con FileGetShortcut.
La idea de BasicOS de crear una función de copia especializada, que haga lo que la copia normal pero que cuando encuentre un link copie lo enlazado, es excelente. De esa manera prácticamente los códigos que tienes en el foro para hacer copias recursivas se pueden usar prácticamente de forma directa.

El problema:
Pero has puesto el dedo en la llaga. El problema está en los posibles ciclos de directorios, que crearían bucles infinitos.
Para evitarlo lo que se me ocurre es ir almacenando en un array la ruta completa de las carpetas que vas copiando (este sería un array diferente del que hablábamos antes para evitar la recursividad). Cada vez que vas a copiar una carpeta (ya sea una real o la enlazada por un acceso directo) primero miras en dicho array si ya la has copiado. Si ya está la ignoras y pasas a la siguiente. Si no está la procesas normalmente, copiándola y metiéndola en el array de carpetas copiadas, para no recopiarla si vuelve a aparecer.
Lógicamente este proceso sólo hay que hacerlo para las carpetas, que son las que pueden crear bucles de copia. Los archivos normales se copian normalmente.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Esgrimidor
Hacker del Foro
Mensajes: 286
Registrado: 19 Oct 2008, 00:59
Ubicación: Santa Cruz de Tenerife
Contactar:

Re: Copia inteligente

Mensaje por Esgrimidor »

Espléndido. Estupenda explicación.

Tendré que estudiar para sacarlo adelante. Cuando pueda, claro.

Un fuerte abrazo a todos los compañeros de AutoIt.
Avatar de Usuario
Esgrimidor
Hacker del Foro
Mensajes: 286
Registrado: 19 Oct 2008, 00:59
Ubicación: Santa Cruz de Tenerife
Contactar:

Re: Copia inteligente

Mensaje por Esgrimidor »

A fecha tengo un exe que hace la copia recursiva en otro lenguaje. Sólo copia el archivo al cual apuntan los enlaces directos en su lugar.
La dinámica que estoy aplicando es copiar primero toda la carpeta. Luego aplicar la copia recursiva que busca en carpetas y subcarpetas.
Por si algo falla he buscado en otro post una utilidad que me permite convertir accesos directos que apunten a archivos en el archivo al que apuntan.

Gracias Ximorro
Avatar de Usuario
Esgrimidor
Hacker del Foro
Mensajes: 286
Registrado: 19 Oct 2008, 00:59
Ubicación: Santa Cruz de Tenerife
Contactar:

Re: Copia inteligente

Mensaje por Esgrimidor »

He hecho caso al personal y tengo también un freeware que me permite obtener un index.html de el contenido de carpetas y subcarpetas.
He hecho pruebas con word 2002 para hacer escritos directores.
Y funciona bien.
Casi estoy listo para poder reorganizar un asunto y pasarlo a un cd/dvd.
En la web hay poco de esto. Localizé unos post sobre este objetivo en vbs, pero mal resueltos. Intentos en java. Intentos en php o algo similar. No me hagan mucho caso.
Al final en otro lenguaje. En AutoIt me ha quedado muy claro como podría hacerse con un poco de dominio del lenguaje.
Tendré que ponerme las pilas y aprender un poco más o estaré dependiendo siempre de la bondad de terceros.

Gracias a los terceros de todo corazón.

Está pendiente el reorganizador documental. Una asignatura difícil, muy difícil.

:smt008
Responder