USB Backup! - En Desarrollo pero estancado... ALLIUDA! xD

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Imagen
Hola amigos de ams specialist, hace tiempo que no ingreso al foro, he estado demaciado ocupado trabajo,, pero ahora les traigo un excelente programa, y aunque no este terminado me gustaria que lo agamos todos juntos, asi lo perfeccionamos y lo compartimos en el foro! :) :friends: :friends:

Se llama USB Backup!, es para hacer un respaldo de mi USB, como yo tengo siempre 2, uno que llevo a todas partes y otro que lo tengo guardado en mi casa (por si las moscas), estoy desarrollando este programa para que aga un backup automatico de mi USB,, aunque me falta lo siguiente; :SOS:
  • - Que copie todos los archivos y carpetas de mi USB a mi otro USB exactamente igual, con el orden de las carpetas y sub carpetas.
    - Que si ve que ya existe el archivo, compare si es mas actualizado (por su fecha de modificacion o algo) y lo sobre escriba o lo salte simplemente.
    - que compare mi USB 1, con mi USB, dos, tanto las rutas de las carpetas, sub carpetas y archivos, para que sean iguales.
    - y que finalmente comprima todo en un ZIP y me tire un dialogo para guardarlo y para subirlo a la nube de mi amigo que me a prestado para respaldar mi USB,,
Ingenioso no creen?! :D :hypno:

Les agradeceria sus opiniones o sugerencias de como sería posible esto, yo por mi parte, ya me adelante con el diseño y algun que otro codigo,,

Les dejo el apz para que lo vean, espero les guste! :D

http://www.mediafire.com/?8nx2nuwoxt178ih
Bueno te he echo alguna cosilla :
- Sincroniza archivos entre usb 1 y 2
- Crea Zip con contenido usb 1

se puede ir mejorando mucho... lo de la fecha de creación lo haria con el modulo date de lua , un saludo

HIDE: ON
Hidebb Message Hidden Description

HIDE: ON
Hidebb Message Hidden Description
;)
I will try it, THX.
Muchas gracias amigos Thedary y rafaxplayer , an sido de gran ayuda,

for x,v in pairs (tfilesUSB1) do
dest=v:gsub(saca_usb1,saca_usb2);
if File.GetAttributes(v).Directory then
t = Folder.Find(saca_usb2,String.SplitPath(v).Filename, false, nil);
if not t then
StatusDlg.Show(MB_ICONNONE, false);

Folder.Create(dest);
end
else


Aunque no se, puedo entender a la perfección estos comandos puedo deducirlo analizandolo detenidamente que la primera parte saca las carpetas y archivos del USB 1 y los compara con los del USB, 2, y si no existen los crea, o los copia dependiendo el caso. , gracias :friends:

Y aunque me quede pensando esta parte del codigo;

dest=v:gsub(saca_usb1,saca_usb2);


No pude encontrarlo en el "Ayuda" del AMS,, serian tan amables de explicarme, me pica la curiosidad de saber.

Ahora me centrare el insertarle el eso del "date" de lua como dice Rafa.
Se trata de la función string.gsub de lua pure que viene a ser un string.replace en ams, la podrás encontrar en la documentación de lua
gracias
Le quiero hechar un ojo :3
Hola a todos amigos de AMS Specialist, acabo de recomendar el foro por taringa!!! :D

Ahora les voy con lo mio:

Cansado toda la noche de poder lograr lo que me proponia, me dispuse a hacerlo yo solo, (junto con la misma ayuda del ams), pero no lo logre :( ,, eso si q me enoja...,, asi que me rindo,, y pido apoyo...

Quiero continuar con el desarrollo de este estupendo programa, asi que me puse a pensar de que forma podia aser que el el programa comparara los archivos del "USB 1" y los cheke con el "USB 2", y viera si estan mas actualizados que el otro (como cuando le cambias algo a una foto, o le agregas un par de lineas mas a un texto, cosas por el estilo), primero pense;

- Sacarle el File.GetCRC y compararlo con los CRC del USB 2, y copiar todo archivo que lo tenia diferente - pero se me hace mucha nota,, cuando comenze, me quede mas perdido de cuando habia comenzado..

- Luego pense utilziar CMD para filtrar por las busquedas de archivos por sus fechas

- y Finalmente me defini por usar el File-Find del mismo AMS,, pucha para q o escoji, se me iso un mundo..:


local saca_usb1 = Input.GetText("Input3");
archivos = "*.*";
tfilesUSB1 = File.Find(saca_usb1, archivos, true, false, nil, nil);
TextFile.WriteFromTable("C:\\MyFile.txt", tfilesUSB1, false);


Aca me pierdo, quisiera sacar los atributos de cada archivo escrito en el txt generador por File.Find,, y pense poner esto

lee = TextFile.ReadToTable("C:\\MyFile.txt");
atributos_a1 = File.GetAttributes(lee).CreationDateISO;


Pero me sale una nota de "Index. 0, bla bla bla"

Hasta le puse eesto, para q se acorte :D

fecha_a1 = String.Left(atributos_a1, 10);


Peró aun asi no me sale :(,, y ya nose que hacer ...,, cada modificacion q le ago, dice,, "table", luego "string" y se me hace volas

Please Help!!! :SOS: :SOS: :SOS: :SOS:
y yo pregunto... el ejemplo que te pase te sirve de algo o no?
Claro que me sirvio rafa,, muchas gracias,, pero me perdi en eso del "FOr", ley en la ayuda del ams sobre las tablas su utilización y eso,, pero no puedo encajar como es que se utilizan para poder concatenar una orden directa generica que resulte en una base de datos fictisia digamos temporal..

Me hechas una manito porfavor! :D :sorry: , te lo agradeceria...
no puedo encajar como es que se utilizan para poder concatenar una orden directa generica que resulte en una base de datos fictisia digamos temporal..
jurl! ahora el que se ha perdido he sido yo :) :)

for se usa para recorrer datos , ya sean tablas o un indice desde un valor numérico (o indice) a otro.

Por ejemplo file.find es una función que retorna una tabla con todas las rutas de archivos que encuentra segun el patron de busqueda, un tabla de file.find seria algo asi:

Obtenemos un filefind...
tbFiles= File.Find("C:\\MyDir","*.*");
en esta representacion no se ve el indice pero esixte de la forma que veras en el siguiente
tbFiles={"C:\\MyDir\\file1","C:\\MyDir\\file2","C:\\MyDir\\file3"}-- etc...
o tambien asi donde se ve el indice
tbfFiles[1]="C:\\MyDir\\file1";
tbfFiles[2]="C:\\MyDir\\file2";
tbfFiles[3]="C:\\MyDir\\file3";
--etc...
--las dos tablas son lo mismo es para que lo veas de diferentes formas , luego tambien se puede definir un indice en una tabla que no sea numérico, pero este no es el caso..

Entonces para recorrer dicha tabla y utilizar sus datos usamos for por ejem:
Debug.ShowWindow(true);
for indice, valor in pairs(tbFiles) do
-- for recorre los datos de la tabla uno a uno una vez...
-- donde indice son los indices de la tabla 1,2,3 etc y indice es un valor que puedes definir con el nombre que quieras.
-- valor es el valor de ese indice , por ejemplo "C:\\MyDir\\file1",C:\\MyDir\\file2","C:\\MyDir\\file3" y lo puedes definir como quieras tambien.
-- entonces los utilizamos dentro del bucle conforme los recorre , vamos a imprimirlos en un debug
Debug.Print("Indice : "..indice.." Valor : "..valor.."\r\n");
end
Espero esto te ayude a entender los bucles y for

Por otro lado aqui cometes el error de darle a File.GetAttributes como parametro lee que te pide la ruta de un solo archivo y tu le das una tabla con las rutas de varios archivos que guardaste en el texto.
lee = TextFile.ReadToTable("C:\\MyFile.txt");
atributos_a1 = File.GetAttributes(lee).CreationDateISO;
para obtener el cretiondateiso necesitas un bucle que recorra la tabla , ejem:
lee = TextFile.ReadToTable("C:\\MyFile.txt");
Debug.ShowWindow(true);
for i,v in pairs(lee) do
atributos_a1 = File.GetAttributes(v).CreationDateISO;--obtenemos atributos de cada ruta (v)
Debug.Print("Archivo : " ..v.." CreationDateIso : "..atributos_a1.."\r\n");--\r\n es para que haga salto de linea
end

atributos_a1 = File.GetAttributes(lee).CreationDateISO;
Muchisimas gracias Rafax, siempre ayudando...

Entendo casi a la perfección,, ahora lo unico que tendria que hacer, es aser ese último codigo que pusiste para que compare el atributo de fecha de los archivos del USB 1 con el USB 2, y si es mas nuevo, lo reemplaze,, lo preparo y lo posteo aver si lo estoy asiendo bien,, :D

Rafax Friend!! :friends: :friends: :friends:

FOR PRESIDENT!! :d :yes: :yes: :yes:
Bueno no parece complicado... en el ejemplo que te pase en el boton de respaldar cambia el codigo por este:
local saca_usb1 = Input.GetText("Input3");
local saca_usb2 = Input.GetText("Input4");
local dest;
local SourceFileDate;
local DestFileDate;
if saca_usb1 == "" then
	Dialog.Message("Un momento...", "Se te olvido seleccionar el USB 1.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
	else
	
	if saca_usb2 == "" then
		Dialog.Message("Un momento...", "Se te olvido seleccionar el USB 2.", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
		else
		tfilesUSB1=File.Find(saca_usb1, "*.*", true, true, nil, nil);
		
		if tfilesUSB1 then
			for x,v in pairs (tfilesUSB1) do
				dest =v:gsub(saca_usb1,saca_usb2);
				if File.GetAttributes(v).Directory then
					t = Folder.Find(saca_usb2,String.SplitPath(v).Filename, false, nil);
					if not t then
					StatusDlg.Show(MB_ICONNONE, false);

						Folder.Create(dest);
					end
				else
					if File.DoesExist(dest)then
						SourceFileDate = File.GetAttributes(v).CreationDateISO;
						DestFileDate = File.GetAttributes(dest).CreationDateISO;
						if SourceFileDate > DestFileDate then
						File.Copy(v, dest, true, true, false, true,CopyCallback);
					
							error = Application.GetLastError();
							if (error ~= 0) then
								Dialog.Message("Error", _tblErrorMessages[error], MB_OK, MB_ICONEXCLAMATION);
								break;
							end
						end
					else
						
						File.Copy(v, dest, true, true, false, true,CopyCallback);
					
							error = Application.GetLastError();
							if (error ~= 0) then
								Dialog.Message("Error", _tblErrorMessages[error], MB_OK, MB_ICONEXCLAMATION);
								break;
							end
						
					end
				end
			end
			
		else
		Dialog.Message("No hay archivos en usb 1");
		end

	end	
	
	if (error == 0) then 
		Dialog.Message("","Sincronizacion completada de archivos entre USB1 y USB2");
	end
	StatusDlg.Hide();

end	
No lo he probado pero debería funcionar. ;)
rafa :num1:

Interesante....

:pc: ...

tiene buena pinta

Lo vere :pc: :pc: :pc: