Comprobacion de archivos

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Buenas peña,
A ver si me podeis orientar en un proyectillo que tengo en mente. La funcion a realizar es la comprobacion y descarga de archivos. Aunque lo que me crea duda es la comprobacion, Os explico.

Supongamos que la ruta C:/archivos de programa/proyecto, tengo unos archivos llamados A, B y C.
Y en un servidor FTP tengo los archivos A,B,C y D.
Me gustaria realizar una apz que me compruebe que en la ruta C:/archivos de programa/proyecto, existe A,B,C y D como segun indico solo tendria A,B y C me faltaria el archivo D. Una vez comprobado que D no está, automaticamente la descargaria del FTP.

En resumen la idea es hacer que compruebe en el pc que existen los mismos archivos que en FTP, de no ser asi descargarlos.

Me podeis orientar? SAludos y gracias fieras.
yo usaria el plugin ftp , con la accion FTP.List para saber los archivos del ftp , despues haces un bucle con un file.find en el directorio local de los archivos del ftp, si da algun false ,guardas el nombre del archivo y ftp.download de ese o esos archivos, seria algo asi ...

Si no lo ves claro empieza el proyecto con lo que tengas y vamos desarrollando entre todos ;)
Gracias Rafa pero el tema del bucle es lo que no termino de entender...

Así he empezado pero ya me quedo atascado:
Conecto con el FTP y le digo que me muestre en un Listbox con casillas para check los diferentes directorios del FTP, para que al seleccionar uno me busque en un directorio u otro. Pero no se decirle a file.find (en este caso al Listbox) que busque en el directorio local de los archivos. No se como seguir y le he dado mil vueltas. A ver si me haceis ver la luz.
FTP.Connect("server", "user", "pass", "", true);
FTP.ChangeDir("/descargas/panel7th/Campeonatos");
-- display the name, size and date for every folder in the current directory
-- in an AutoPlay Media Studio listbox object named "DirList"
-- (note: the listbox object must already exist on the current page)

-- empty the listbox
ListBox.DeleteItem("ListBox1",LB_ALLITEMS);

tbFolders = FTP.ListFolders();

for i = 1, tbFolders.Count do
    local name = tbFolders[i].Name;
    local size = tbFolders[i].Size;
    local date = tbFolders[i].Date;

    ListBox.AddItem("ListBox1", name.."", "");
end
Bueno por partes ... para que quieres listar los directorios? , eso es cosa tuya , pero tu consulta era que comprobara los archivos de un directorio en el ftp (por ejemplo : "/descargas/panel7th/Campeonatos") si alguno no existia en el directorio local por ejem: "Autoplay\\Docs\\Files"

Bien según tu código , conectas al ftp y entonces deberías listar archivos del directorio que quieras comprovar , por ejemplo:
FTP.Connect("server", "user", "pass", "", true);-- conectas
FTP.ChangeDir("/descargas/panel7th/Campeonatos");--accedes al directorio
tblFiles = FTP.ListFiles()-- listas archivos 
Una vez tienes la tabal con los archivos del ftp , la extensión .Name es el nombre ,si lees la ayuda veras que la tabla da mas detalles sobre los archivos... y ahora tendriamos que hacer un bucle para comprovar si hay alguno que no esixte en nuestro directorio local , mejor que file.find ( sorry) seria File.DoesExist :
for i = 1, tbFiles.Count do-- Bucle para recorrer la tabla de los archivos del ftp
	bValue = File.DoesExist(_SourceFolder.."\\Autoplay\\Docs\\"..tbFiles[i].Name);-- Comprobamos si cada uno existe en el dir local

	if bValue == false then -- si da falso , es que no existe ( leer ayuda)
		Dialog.Message("Notice", "Se ha encontrado que "..tbFiles[i].Name.." no existe en tu directorio local", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);-- mensage
	end

end
Comprueva si esto te funciona y ya seguimos con el sistema de descarga y demas ;)
Well done  rafax

:pc:
Dios tienes razon con File.DoesExist, no se me hubiera ocurrido en la vida.... ok estoy fuera de casa hasta el martes, voy a ver si puedo meterla mano estos dias y si no lo pruebo en cuanto llegue...

Muchas gracias Rafa te mantengo informado segun haga la prueba...
Gracias fieras si es que lo que haceis aquí no tiene nombre y no está pagado.
Muy interesante... me lo apunto!!!
Buenas chicos he estado de vacaciones y arreglando pequeños asuntillos y he tenido que dejar esto un poquito de lado.
Pero vengo con ganas de retomarlo.

He seguido al pie de la letra los consejos de Rafa (al cual le estoy enormemente agradecido) pero cada me estoy liando mas. Y por mas horas y horas que le estoy echando no consigo aclararme y la cabeza me echa humo, me cabreo apago el pc y lo dejo hasta que me vuelven a entrar las ganas.

Como veo que puede ser que con forme pido mas ayuda mas dudas me asaltan os subo una pequeña programa el cual pretendo imitar.
Os situo antes que nada para que sepais de que va el tema.

A ver pertenezco a una comunidad de simracers en la cual organizamos campeonatos de carreras online con el simulador rfactor. Este simulador es de codigo abierto y existen muchos modders que hace de rfactor un simulador ilimitado.
Bien dentro de estos campeonatos que organizamos segun del tipo que sean se necesitan descargar unos archivos u otros. Hasta ahora estamos usando el 7th panel, creado por mi gracias a esta fantastica comunidad, se puede ver y probar aquí http://www.7thracing.com/forum/index.ph ... 649.0.html El caso es que hemos encontrado un programa que tiene la misma funcion que nuestro 7thPanel pero con la mejora de que automaticamente te comprueba los archivos de tu pc con los subidos en el FTP o servidor.
Esto hace mucho mas comodo para el usuario conseguri los archivos necesarios para poder competir en nuestros campeonatos.

Bien el programa al que me refiero se llama SIMSYMCPRO.
Os lo dejo aqui la descarga http://www.7thracing.com/descargas/prog ... yncPro.zip
NOTA: Deciros que no funcionara si no teneis el simulador instalado.Si quereis probarlo desde nuestro 7th panel podeis bajarlo en version lite que no pesa mucho.

Y ahora os dejo unas imagenes de como es su funcionamiento.

Esto es el programa en si, Como se puede ver se elige un campeonato al cual deseas descargar sus archivos.
Imagen


Una vez seleccionado puedes iniciar la descarga.
Imagen

Otra captura de la descarga.
Imagen

Imagen uan vez descargado los archivos necesarios.
Imagen

Yo lo unico que necesito es saber como compara los archivos locales con los alojados en el servidor o FTP.
A ver si un alma iluminada me enseña el camino.
Lo que necesitas es fácil de lograr, ya he hecho algo similar con un FileMonitor (comprueba si los archivos fueron modificados, eliminados ó creados) pero es para otra cosa y nada de FTP, así que más sencillo. Lo que debes hacer es primero generar una lista de los archivos que tienes en tu computadora (obvio de la carpeta a donde deseas bajar los archivos) y dicha lista la guardas en una tabla de lua. Te quedará algo así:

tabla = {};
tabla[1] = "archivo.x"
tabla[2] = "archivo.y"
tabla[3] = "archivo.z"

Luego te bajas una lista de los archivos del ftp, la cual en una tabla de lua te quedará así:

tablaftp = {};
tablaftp[1] = "archivo.x"
tablaftp[2] = "archivo.y"
tablaftp[3] = "archivo.z"
tablaftp[4] = "archivo.ccc"

Luego haces un "for loop" de la siguiente forma:
for y, archivoftp in pairs(tablaftp) do
	for x, archivolocal in pairs(tabla) do
		if(archivolocal == archivoftp) then
			tablaftp[y] = nil;
			tabla[x] = nil;
			break;
		end
	end
end
A la tabla lua llamada "tablaftp" le quedarán sólo los archivos que existen en el ftp pero que no existen en tu computadora.
Ok pero imagino que estas tablas debería de crearlas en formato .ini
Y luego una de ellas ubicarla en el FTP y la otra en local.
y si eso es correcto ¿al for loop como le indico la ruta donde esta ubicada en el FTP? ¿Voy bien encaminado?

Joer es que de verdad que esto se me escapa.
Obviamente no hablo de nada de archivos INI. La tabla de archivos del FTP ya la tienes (rafax sugirió tbFiles) y la de los arcihvos de tu computadora la sacas haciendo un File.Find. Me me preguntes como hacerlo ya que es algo realmente sencillo.
rafaxplayer escribió:Bueno por partes ... para que quieres listar los directorios? , eso es cosa tuya , pero tu consulta era que comprobara los archivos de un directorio en el ftp (por ejemplo : "/descargas/panel7th/Campeonatos") si alguno no existia en el directorio local por ejem: "Autoplay\\Docs\\Files"

Bien según tu código , conectas al ftp y entonces deberías listar archivos del directorio que quieras comprovar , por ejemplo:
FTP.Connect("server", "user", "pass", "", true);-- conectas
FTP.ChangeDir("/descargas/panel7th/Campeonatos");--accedes al directorio
tblFiles = FTP.ListFiles()-- listas archivos 
Una vez tienes la tabal con los archivos del ftp , la extensión .Name es el nombre ,si lees la ayuda veras que la tabla da mas detalles sobre los archivos... y ahora tendriamos que hacer un bucle para comprovar si hay alguno que no esixte en nuestro directorio local , mejor que file.find ( sorry) seria File.DoesExist :
for i = 1, tbFiles.Count do-- Bucle para recorrer la tabla de los archivos del ftp
	bValue = File.DoesExist(_SourceFolder.."\\Autoplay\\Docs\\"..tbFiles[i].Name);-- Comprobamos si cada uno existe en el dir local

	if bValue == false then -- si da falso , es que no existe ( leer ayuda)
		Dialog.Message("Notice", "Se ha encontrado que "..tbFiles[i].Name.." no existe en tu directorio local", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);-- mensage
	end

end
Comprueva si esto te funciona y ya seguimos con el sistema de descarga y demas ;)
Ok Perfecto ahora si me va.
El caso es que por un par de faltas de ortografia no me funcionaba y me liaba con lo que no llegaba a entender el codigo.

Ahora como haria la descarga en caso de dar un valor Falso?
El ejemplo del ayuda del plugin...
FTP.Download("1ws2610.txt", _TempFolder .. "\\Hamlet.txt");
err = Application.GetLastError();

-- step 4: log off
FTP.Disconnect();

-- ...now check whether FTP.Download generated an error
if err == FTP.OK then
    Dialog.Message("Success!", _TempFolder.."\\Hamlet.txt was downloaded successfully!");
else
    Dialog.Message("Error", _tblErrorMessages[err]);
end
Gracias rafa. perfect.
Es que no se por que no me va la ayuda la action FTP. y algunas otras y en la web de indigorose no la encuentro. ¿Me podeis pasar el enlace?

y ya que estamos con el tema, si quiero descargar todo lo que se encuentra en un directorio del FTP ya que este ademas de archivos contendria tambien carpetas
¿deberia de ponerlo así?
FTP.Connect("xxxxxxx", "xxxxxxxxxxx", "xxxxxxxxxx", "", true);
FTP.ChangeDir("/descargas/panel7th/Campeonatos/Formula 1");
tblFiles = FTP.ListFiles()-- listas archivos
target_folder = Dialog.FolderBrowse("Instalar en carpeta raiz de rFactor ", "C:\\");

for i = 1, tblFiles.Count do-- Bucle para recorrer la tabla de los archivos del ftp
        bValue = File.DoesExist(target_folder.."\\Autoplay\\Docs\\"..tblFiles[i].Name);-- Comprobamos si cada uno existe en el dir local

        if bValue == false then -- si da falso , es que no existe ( leer ayuda)
                FTP.Download("*.*", target_folder.."*.*");
err = Application.GetLastError();
Aquí te dejo un enlace a un ejemplo de ftp: http://alucardfile.alucardwarez.net/?download=xFtp3.apz
remus escribió:Gracias rafa. perfect.
Es que no se por que no me va la ayuda la action FTP. y algunas otras y en la web de indigorose no la encuentro. ¿Me podeis pasar el enlace?
Deberia provar en project/plugins/FTP/about plugin/plugin help si esto no te va deberias hacer una limpieza de mas y reinstalar los plugins con el pack de ceone
remus escribió: y ya que estamos con el tema, si quiero descargar todo lo que se encuentra en un directorio del FTP ya que este ademas de archivos contendria tambien carpetas
¿deberia de ponerlo así?
El código que muestras tiene errores por un tubo , falta un end lo primero , utiliza list.folder para saber is hay carpetas y las tendrás que volver a crear y rellenar de archivos descargados del ftp , haber si tengo mas tiempo y monto algo , ves probando cosillas
Yo en un proyecto que hice hace tiempo y lo hacía con un archivo situado en la FTP, el cual podía acceder a través de HTTP también con la lista de archivos e incluso el CRC para comprobar que estaba correctos o si se habían modificado, después ese archivo lo abría y comprobaba los archivo.
Más o menos sería así:

HIDE: ON
Hidebb Message Hidden Description


y el archivo con la lista de archivos sería:
file1.ext@12345
file2.ext@12345
file3.ext@12345
...
El cual es primero el nombre del archivo y después de la arroba el crc, el cual es opcional pero viene bien por si modificas el archivo.

Es un ejemplo básico, pero sirve para lo que necesitas:
Lo que hace es cuando pulsas el botón se conecta a la FTP y se baja el archivo con la lista de archivos, después comprueba si existen los archivos. Si existe comprueba el CRC y si no se lo baja.
Muchas gracias, lo comprobaremos que a mi esto curiosear ejemplos me encanta ya que es como mas aprendo.
Nada que no adelanto con el tema este. Consigo conectar, comprobar si existe el archivo y descargarlo siempre y cuando yo le indique nombre y formato.

Este es el codigo que estoy usando:
FTP.Connect("xxxxxxxxxx", "xxxxxxxx", "xxxxxxxxx", "", true); --Datos para conectarnos al FTP
FTP.ChangeDir("/descargas/panel7th/Campeonatos/Formula 1");--Situacio en el directorio deseado
tblFiles = FTP.List()-- listado de archivos
target_folder = Dialog.FolderBrowse("Instalar en carpeta raiz de rFactor ", "C:\\");--Seleccion dir local

for i = 1, tblFiles.Count do-- Bucle para recorrer la tabla de los archivos del ftp
        bValue = File.DoesExist(target_folder..tblFiles[i].Name);-- Comprobacion si cada uno existe en el dir local

        if bValue == false then -- si da falso , es que no existe
                Dialog.Message("Notice", "Se ha encontrado que "..tblFiles[i].Name.." no existe en tu directorio local", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);-- mensage
                        FTP.Download("archivoA.txt", target_folder.. "\\archivoA.txt");--Descarga
err = Application.GetLastError();

-- desconectar
FTP.Disconnect();

--Comprobacion si FTP dió error
if err == FTP.OK then
    Dialog.Message("Éxito!", target_folder.."se ha descargado satisfactoriamente!");
else
    Dialog.Message("Error", _tblErrorMessages[err]);
end
        end

end
Como se puede ver en la descarga FTP consigo descargar por que le indico como se llama y su formato, (archivoA.txt) pero si le pongo por ejemplo un comodin "*.*"
¿ no deberia descargarme todo lo que hubiera en ese directorio? tal que asi:
FTP.Download("*.*", target_folder.. "\\*.*");--Descarga
Quiero descargar todo lo que hay en ese directorio tanto carpetas como archivos pero no lo consigo.
Nadie? vamos chicos que me queda el ultimo suspiro jajaj