Foros del Web » Programación para mayores de 30 ;) » Programación General »

Puedo hacer esto con VisualBasic? (Buscar ficheros)

Estas en el tema de Puedo hacer esto con VisualBasic? (Buscar ficheros) en el foro de Programación General en Foros del Web. Quiero hacer una aplicacion que me permita comparar los ficheros entre 2 rutas. Esto es sencillo e incluso hay varios programas freeware que lo hacen. ...
  #1 (permalink)  
Antiguo 09/06/2004, 05:36
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Puedo hacer esto con VisualBasic? (Buscar ficheros)

Quiero hacer una aplicacion que me permita comparar los ficheros entre 2 rutas.

Esto es sencillo e incluso hay varios programas freeware que lo hacen.
Pero yo quiero que me compare apartir de un trozo del nombre del fichero, por que puede que en la 2ª ruta, el fichero tenga un nombre ligeramente diferente.
EJ:
Ruta 1-> Soy321unJpg.jpg Ruta 2-> Soy321.jpg

Y lo que quiero es que me muestre el que tenga ese trozo (como el buscador de windows, pero pudiendo poner extension). El asunto seria buscar algo asi: %321%.jpg o incluso %321%.* por si acaso tiene otra extension (como bmp o gif).

Esto se puedo hacerlo con Visual basic 6?
¿Me decis donde ver info? y si es en español mejor.
No tengo conocimientos en C++, pero si de programacion en C y VB.

SALU2.
  #2 (permalink)  
Antiguo 09/06/2004, 05:39
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Para buscar archivos con la API de Windows se usan estas funciones:

FindFirstFile
FindNextFile
FindClose

A la busqueda le podes pasar comodines como *.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 11/06/2004, 01:49
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Mmm, no te e entendido.

Quiero hacer que puedas elegir 2 carpetas (origen y externa por ejemplo).

Y mire que nombres de fichero no estan en la de origen, para asi poder añadirlos directamente sin tener que mirarlo 1 a 1 manualmente.

Estoy probando con DirListbox y FilesListBox pero no consigo que me diga que ficheros faltan, ni se como recorrer exactamente los ficheros.

Ayuda, por favolllll
  #4 (permalink)  
Antiguo 11/06/2004, 01:52
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Usando las APIs que te dije y dandole como parametro de busqueda *.* te va devolver todos los ficheros, si creas dos listas con los ficheros devueltos en la carpeta de origen y la externa simplemente tenes que buscar cada uno de los archivos que existan en la carpeta de origen en la carpeta externa y si no existen copiarlos, es bastante simple me parece.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 11/06/2004, 02:48
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Ok.
E cargado el visor api, e buscado esas 3 funciones y las e copiado y pegado en el form (si lo hacia en un procedimiento me daba error de que no se podian poner comentarios antes del END).

Me da error de compilacion:
No se a definido el tipo definido por el usuario.

Aparte la ayuda sobre FindFile y demas del MSDN no me aclara gran cosa.
Y no se como e de utilizarlo exactamente ya que nunca las e usado.
¿Puedes decirme donde ver info sobre el uso?

SALU2.
  #6 (permalink)  
Antiguo 11/06/2004, 02:53
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
La ayuda de la MSDN es excelente, lo que pasa es que está escrita para otro lenguaje mucho más avanzado que es C.

Entra a esta dirección http://www.allapi.net/ y bajate el programa API-Guide, ahi vas a encontrar ejemplos en VB.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 11/06/2004, 05:31
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Bua, tanto C y VisualBasic los e estudiado, sobre todo C, pero me parece algo complicado el codigo de la web(viendo que tu dices que es bastante sencillo realizar el programa que NECESITO, estoy pensando en que me e de ahorcar, jajja).

Me tomare un respiro este finde y haber si consigo hacer lo que busco, pues me parece una aplicacion muy interesante para actualizar ficheros.

PD: El FindStr, funciona fenomenal con algo escrito por el usuario. Ahora falta ver como hacer para que el propio programa lea el cacho de nombre del fichero (Los numeros que identifican la imagen) por si solo y uno a uno.

PD2: E probado el codigo de ejemplo de esa web, y ahi no da el error ya que declara unos Types...
Nuse, veo que hay que tocar muchas cosas y no se explican.

SALU2.
  #8 (permalink)  
Antiguo 11/06/2004, 05:39
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Con la ayuda de la MSDN ayer cree un programa que recorre un directorio buscando los archivos *.c*, los va metiendo en un array, los compila y los linkea posteriormente.

Si te interesa te puedo dar el código pero esta escrito en C++.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 14/06/2004, 02:22
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Bueno, pues ya estoy de nuevo con las manos en la masa.

El asunto es bien simple.

Leer 2 directorios (ORIGEN - EXTERNO).
Comparar el cacho de fichero que tiene el numero identificador.
Mostrar en pantalla los ficheros que existen en EXTERNO con esa cadena y NO estan en ORIGEN.

Los ficheros son de 2 tipos -> IMG4611922.* o Foto120345Socio.*

Asi que seria buscar en la los ficheros de ORIGEN, la cadena numerica de cada fichero en EXTERNO.

E hecho unas 3 aplicaciones y hago perfectamente recuento de ficheros y relleno de listas con los ficheros para cada directorio, pero no se hacer la comparacion.

Ademas, no todos los ficheros tienen el mismo numero de caracteres antes de las cifras por lo que no se como podria "leerla" y pasarla como comodin de busqueda.
SALU2 y gracias por el apoyo.
  #10 (permalink)  
Antiguo 14/06/2004, 02:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Tal vez sea mucho más fácil de lo que intentas hacer, si lo que queres saber es si TODOS los archivos de la carpeta origen estan en la carpeta externa simplemente creas la lista de archivos de origen y comprobas si ese archivo existe o no en la otra carpeta, para que buscarlo item por item?

Si por ejemplo tenes el primer item de la lista origen que es IMG4611922.bmp lo que haces es lo siguiente:

_crear una cadena con el path externo (por ej. e:\archivos de programa\imagenes) a ese path le agregas el nombre del archivo, entonces quedaría así: e:\archivos de programa\imagenes\IMG4611922.bmp

_comprobas si existe esa cadena (es un directorio + un archivo)

Yo uso este código que me inventé (C):

Código:
BOOL FileExists(char *FileName)  
{  
  HANDLE Result = CreateFile(FileName,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);  
  if (Result == INVALID_HANDLE_VALUE)  
  {  
    return FALSE;  
  }  
  else  
  {  
    CloseHandle(Result);  
    return TRUE;  
  }  
}
_si no existe se copia el archivo y sino se sigue con el siguiente item de la lista de origen
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 14/06/2004, 03:07
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Ok, vamos poco a poco.

Entonces, creo una lista con los ficheros de la carpeta EXTERNA (un CD-rom por ej) [Esto ya ta] y miro si existen los ficheros en la de ORIGEN(C:\Imagenes por ej).

Ahora bien, ¿uso un filelistbox (el cual me permite poner pattern) o ListBox?
¿Como voy leyendo los nombres de la lista para ir comparando?

Ademas, el quid esta en que no quiero que me mire el nombre del fichero entero (CARPETA EXTERNA), sino solo el codigo que esta en el y si existe algun fichero con ese codigo en ORIGEN, pasar al siguiente.
Cuando un codigo no encuentre coincidencia en ORIGEN, se añada a una a una lista AHORA SI el nombre completo del fichero.

El codigo que has puesto no se muy bien donde ponerlo.
SALU2.
  #12 (permalink)  
Antiguo 14/06/2004, 03:14
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
Cuando hablo de lista me refiero a cualquier tipo de array, si usas un listbox tenes que referirte a cada uno de los items, da lo mismo.

Lo que queres entonces es:

EXTERNA=FUENTE y ORIGEN=DESTINO
Teniendo el archivo externo (cd) por ej. d:\imagenes\imagen435.bmp siendo el directorio externo d:\imagenes\ se comprueba si existe el archivo origen (hd) por ej. c:\program files\imagenes\imagen435.bmp siendo el directorio origen c:\program files\imagenes\, si existe se continua con el siguiente archivo de la lista de archivos externos y sino se copia.

Con código te referis al nombre? C:\DIRECTORIO\NOMBRE.EXTENSION

El código que puse antes sirve para comprobar si un archivo existe.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #13 (permalink)  
Antiguo 14/06/2004, 03:32
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Mira, voy a ponertelo tal cual seria.

CD-ROM o otra unidad: D:\ [Llamemoslo FUENTE]

Mi ruta: C:\Imagenes\ [Llamemoslo ORIGEN]

Los ficheros de ORIGEN son: I4611755.jpg y IMG4611755EN.gif

Los ficheros en FUENTE pueden ser de otros nombres y extensiones (.gif, .jpg o .dwg), pero el numero de 7cifras es unico [Llamemoslo CODIGO].

FUNCIONAMIENTO:
Coge el 1er codigo de FUENTE y mira si hay algun fichero con el.
Si hay, pasa al siguiente elemento de FUENTE, sino hay añade el nombre completo de ese fichero a una lista.

Asi cuando acabe, quedara una lista con los ficheros que tiene FUENTE y faltan en ORIGEN.

SALU2 y gracias por estar ayudandome, de veras.
  #14 (permalink)  
Antiguo 14/06/2004, 03:39
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
El numero de cifras y las letras coinciden?

Osea si en FUENTE tenemos IMG4611755EN.jpg en ORIGEN tenemos que buscar un archivo llamado IMG4611755EN.*, verdad?

Si es así no hay problema, hay que usar FindFirstFile, creas una nueva busqueda en el directorio de ORIGEN con el archivo IMG4611755EN.* y si te devuelve un resultado es porque hay un archivo y sino va a la lista para ser copiado.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #15 (permalink)  
Antiguo 14/06/2004, 03:46
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Ahi esta el problema, que pueden no coincidir lo unico identico es el numero.

De todas formas, aunque coincidieran, no se como hacer que "busque" para cada fichero de FUENTE. Dime que uso, listbox, filelistbox, un vector, o que.

Sobre el codigo que pusiste, ten encuenta que estoy haciendo esto con VisualBasic 6.
  #16 (permalink)  
Antiguo 14/06/2004, 03:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No es TAN complicado, tenes que lograr que el FindFirstFile haga esto:

Teniendo IMG1234567NEW.BMP buscar *1234567*.* , por lo tanto tenes que buscar el código de siete cifras (se puede hacer que busque las cifras que haya, si no fueran siete por ejemplo), al encontrar el código crear una string de busqueda (para FindFirstFile) que sea directorio + * + código + *.* y con eso funciona.

Ej. c:\imagenes\*1234567*.*

Yo tengo en cuenta que lo estas haciendo en VB 6, pero vos tenes que tener en cuenta que yo no uso más VB y estoy en el trabajo, si queres usar la rutina la pasas a VB y sino buscas otra, no tengo tiempo para pasarla yo, lo siento.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #17 (permalink)  
Antiguo 14/06/2004, 04:33
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Tranquilo, te entiendo perfectamente y te agradezco mucho tu ayuda.

Pero solo tengo el ejemplo de la web que me pasaste y ahi hace muchas cosas, pero no puedo implementar las funciones FindFile en mi aplicacion y tampoco se como usarla realmente.
Cuando tengas tiempo si puedes me lo explicas.
  #18 (permalink)  
Antiguo 14/06/2004, 04:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
FindFirstFile: se le pasa como parametros un path (puede tener comodines como * por ejemplo) y una estructura WIN32_FIND_DATA que la función va a llenar si encunentra algún archivo que coincida. Si el valor devuelto por la función es -1 (INVALID_HANDLE_VALUE) es porque no encontro nada de lo contrario nos devuelve un HANDLE para poder seguir efectuando la busqueda con todos los archivos que concuerden con el path que le pasemos.

FindNextFile: esta función es más simple todavía, depende absolutamente de la anterior, se le pasa como parametros el HANDLE devuelto por la función FindFirstFile y una estructura WIN32_FIND_DATA que va a llenar con el resultado encontrado. Si devuelve cero es porque no hay más archivos.

FindClose: está función tiene que ser llamada cuando terminemos la busqueda tanto si sólo buscamos con FindFirstFile como si seguimos usando FindNextFile, el parametro que se le pasa es el HANDLE devuelto por FindFirstFile.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #19 (permalink)  
Antiguo 14/06/2004, 05:01
 
Fecha de Ingreso: enero-2004
Mensajes: 58
Antigüedad: 20 años, 10 meses
Puntos: 0
Muy bueno tio, eres una persona seria y cumplidora

E estado trasteando y e conseguido hacer (Sin uso de FindFile):

2 FileListBox uno para FUENTE y otro para ORIGEN que se rellenan con los ficheros de cada ruta (Que puedo cambiarla mediante DrivelistBox y DirListBox enlazados).

Al pulsar un boton comprueba para cada uno de FUENTE [mediante .Listindex y .Filename] si existe en ORIGEN.
Si esta, muestra la imagen (he hecho la prueba con 4 solo puestas adrede) y si no esta pasa a la siguiente.

Ahora solo falta que pueda coger los 7numeros de FileListBox.filename, meterlos en una variable y ponerla en la condicion en lugar de todo el .Filename.

¿Lo conseguire?

Enga, que parece que esto ya coge colorrrrrrrrr!!.
  #20 (permalink)  
Antiguo 14/06/2004, 05:09
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años, 6 meses
Puntos: 74
No se como funcionan esos controles de VB, pero supongo que lo vas a conseguir.

Para obtener el código tenes que recorrer la string caracter por caracter y copiar los que sean numeros (48 es 0 y 57 es 9 en ASCII) a la nueva string que va a ser la condición de .Filename
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:21.