progress doble y file delete

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
Hola a todos

Estoy bloqueado en un codigo que estoy haciendo para el file delete con doble progress. En un progress lleva la funcion callback por defecto para la funcion file.delete. y funciona ok, el segundo progress tiene otro codigo que trata de mostrar el estado actual en megabytes de peso de la carpeta donde se encuentran los archivos a borrar.

El problema no se si es de tipo matematico ( yo no soy bueno en matematicas :/ ) o de tipo asignacion de variables, porque al arrancar el codigo en tiempo real me los borra, se ejecuta el progress 1 que es el que va asociado su codigo el callback del file.delete, pero no hace nada el segundo progress se queda parado hasta que sale directamente al 100 %. Esto ocurre cuando el progress 1 llega al 100 % de su borrado.

Codigo para que lo veais:

En global function poner este callback
function DeleteProgress(Source, Deleted, Total)

                -- Set the file name
                        SplitDest = String.SplitPath(Source);
                        soloExt = SplitDest.Extension;
                        soloFile = SplitDest.Filename;
                        soloFolder = SplitDest.Folder;
                        stConcat = String.Concat(soloFile, soloExt);

                        -- Update progress1
                        nTotalPercentage = Math.Floor(Deleted / Total * 100);
                        Progress.SetCurrentPos("Progress1", nTotalPercentage);
                       
                       
                     --SetString =  "Borrando archivo "..soloFile.." a "..nTotalPercentage .." %";
                     Progress.SetText("Progress1", "Borrado al "..nTotalPercentage.." %");
            		 Label.SetText("Label1", "Borrando archivo "..stConcat);
               
                if Deleted > Total then
                return false;
                else
                return true;
                end
              
end

En el evento onclick del boton esto:
-- OPERACION 1: ESCOGER CARPETA A BORRAR ARCHIVOS
FOLDER = Dialog.FolderBrowse("Please select a folder:", "AutoPlay\\Docs");

nTotalperc = 0;

	-- OPERACION 2: BUSCAR TODOS LOS ARCHIVOS CONTENIDOS EN ESA CARPETA
	found = File.Find(FOLDER, "*.*", true, true, nil);
	
	if found ~=-1 then
	--=======	
		-- OPERACION 3: CREAR LISTADO DE ARCHIVOS ENCONTRADOS
		for index, datos in pairs (found) do
		TextFile.WriteFromString(_DesktopFolder.."\\found.txt", datos.."\r\n", true);--meto una lista de archivos encontrados
		end
	
		-- OPERACION 4: UNA VEZ CREADA LA LISTA, MIRO ARCHIVO POR ARCHIVO...
		tblOld = TextFile.ReadToTable(_DesktopFolder.."\\found.txt");

		-- OPERACION 5: CALCULO TAMAÑO TOTAL DE LA CARPETA EN MEGABYTES
		totalsize = 0;--Antes que nada declaro primero una variable numerica para ejecutar un contador a 0 por defecto
		for i, foundData in pairs (found) do
		totalsize = totalsize + File.GetSize(found[i]);--sumo el valor de la carpeta con el total de cada archivo.
		end
		totalsize = Math.Floor(totalsize/1024000);--resultado del total de todos los archivos en carpeta

		-- OPERACION 6: ANTES DE QUE SE ME BORRE EL ARCHIVO LOCAL MIDO SU PESO...
		filesize = 0;--Declaro una variable numerica para ejecutar un contador a 0 por defecto, esta solo mostrara el restante en MB a borrar
		for j, borrables in pairs (tblOld) do
		filesize = totalsize - File.GetSize(tblOld[j]);
		end
		filesize = Math.Floor(filesize/1024000);--resultado de los MB restantes pendientes de ser borrados
			
		-- OPERACION 7: CREO LA FORMULA FINAL Y OBTENGO EL PORCENTAJE DE BORRADO TOTAL CONTANDO LOS ARCHIVOS QUE QUEDAN Y LOS ORIGINALES...
		--------------  ESTA FORMULA SE MUESTRA EN EL OBJETO PROGRESS 2
		nTotalperc = Math.Floor((filesize/totalsize)*100);--resultado del total en MB a borrar 

	--=======	
	else
	Dialog.TimedMessage("Error!", "No hay archivos que borrar, carpeta inexistente o vacia", 2000, MB_ICONINFORMATION);
	Application.ExitScript();
	end
	

----
if FOLDER ~= "" and FOLDER ~= CANCEL then
File.Delete(FOLDER.."\\*.*", false, false, false, DeleteProgress);
			--
			Progress.SetStep("Progress2", 0);--inicializo el progreso de la operacion desde 0
			Progress.SetRange("Progress2", 1, 100);--pongo el total de recorrido en porcentaje hasta el 100%
			Progress.SetCurrentPos("Progress2", nTotalPerc); --SE METE EL PORCENTAJE OBTENIDO EN LA BARRA DE PROGRESO 2
			Progress.SetText("Progress2", "Total en megabytes "..filesize.." pendientes de borrar al "..nTotalperc.." %");--LO METO EN LA BARRA DE PROGRESO 2.
			Progress.StepIt("Progress2");
			--			
		    if File.Find(FOLDER, "*.*", false, false, nil, nil)== nil then
	   		Progress.SetText("Progress1", "Borrado total Terminado!");
	   		Progress.SetText("Progress2", "Borrado completo!");
	   		Label.SetText("Label1", "Borrado Terminado!");
			Progress.SetCurrentPos("Progress1", 100);
			Progress.SetCurrentPos("Progress2", 100);
			end
else
Application.ExitScript();
end
----

Prueba con este Callback:
function cbDeleteFiles(sSource, nDeleted, nTotal)
	nDeleted = Math.Floor(nDeleted, 0);
	nTotal = Math.Floor(nTotal, 0);
	Progress.SetRange("Progress2", 0, nTotal);
	nPercentage = Math.Floor((nDeleted / nTotal * 100));
	Progress.SetCurrentPos("Progress1", nPercentage);
	Progress.SetCurrentPos("Progress2", nDeleted)
	Application.Sleep(100);
	if (nDeleted == (nDeleted+nTotal)) then
		return false;
	else
		return true;
	end
end
Dormi la aplicacion 100 milisegundos para que aprecies el avance de los dos progress, adapta el callback a tus necesidades, no es dificil, ahi comentas como te fue.

Saludos viejo ;)

Editado, falta de codigo.

hola metafunken, creia que las funciones callback eran rigidas y que no se podia meter variables distintas de las que vienen en el ams para la funcion ( file.delete) por defecto, pero he comprobado que si se puede meter variables internas sin tocar los parametros requeridos para el callback.

De acuerdo con tu sugerencia esta es la solucion que salio bien ( gracias colega por la idea de meter directamente el progress 2 en la funcion lol he perdido el tiempo para nada creando funciones paralelas por cada progresss jajaja ):

EN global fuctions;
function bDeleteFiles(sSource, nDeleted, nTotal)

        SplitDest = String.SplitPath(sSource);
        soloExt = SplitDest.Extension;
        soloFile = SplitDest.Filename;
        soloFolder = SplitDest.Folder;
        stConcat = String.Concat(soloFile, soloExt);
        

        nDeleted = Math.Floor(nDeleted, 0);
        nTotal = Math.Floor(nTotal, 0);
        nPercentage = Math.Floor((nDeleted / nTotal * 100));

        fsize = 0;     
        fsize = File.GetSize(sSource);
        nMB = String.GetFormattedSize(fsize, FMTSIZE_AUTOMATIC, true);
        
        Paragraph.SetText("Paragraph1", "Borrando archivo "..stConcat);

        Progress.SetRange("Progress2", 0, nTotal);
        Progress.SetCurrentPos("Progress1", nPercentage);
        Progress.SetCurrentPos("Progress2", nDeleted);
        Progress.SetText("Progress1", "Borrado total al "..nPercentage.." %");
        Progress.SetText("Progress2", "Borrando archivo "..stConcat.." ["..nMB.."]");
        
        
        Application.Sleep(100);
        if nDeleted > nTotal then--esta formula borra mejor todos los archivos ( idea de rafax)
                return false;
        else
                return true;
        end
end

En boton, evento OnClick:
FOLDER = Dialog.FolderBrowse("Please select a folder:", "AutoPlay\\Docs");

----
if FOLDER ~= "" and FOLDER ~= CANCEL then
File.Delete(FOLDER.."\\*.*", false, false, false, bDeleteFiles);--aqui esta el callback
end
----
--
--me aseguro de que no le quedan mas archivos que borrar, si es asi se cierra la operacion                     
if File.Find(FOLDER, "*.*", false, false, nil, nil)== nil then
Progress.SetText("Progress1", "Borrado total Terminado!");
Progress.SetText("Progress2", "Borrado completo!");
Paragraph.SetText("Paragraph1", "");
Progress.SetCurrentPos("Progress1", 100);

	posProg = Progress.GetCurrentPos("Progress2");--Me aseguro de que si el progress 2 este completo
	if posProg < 100 then
	Progress.SetCurrentPos("Progress2", 100);
	end	
	
end
--
Gracias por la idea

thanks

carsonzillo escribió:creia que las funciones callback eran rigidas
En este caso el Callback del File.Delete() cuenta con tres parametros fundamentales:

Source, Deleted y Total

Tu los puedes nombrar como se te antoje, aunque lo mas correcto es nombrarlos o renombrarlos con algun prefijo, por ejemplo:

sSource, nDeleted y nTotal...

Para no perder el hilo del parametro. Sin embargo es menester que esos tres parametros existan y, recomendablemente, esten colocados en el orden anterior aunque no los utilices del todo.

Segun parece aun no comprendes del todo como funciona o de que manera fluye el codigo pues te piensas precisamente lo que haz escrito: "creia que las funciones callback eran rigidas". En ningun lenguaje de programacion un fragmento de codigo o un codigo completo es exactamente un estatuto, lo que te quiero decir con lo anterior es que tu debes seguir tus propios estatutos, aventurarte a crear tus propios codigos con tus propias variables y demas, asi como las reglas se hacen para romperse los codigos se crean para mejorarse y simplificarse.

Por otro lado si, los parametros propios del Callback, como dices, son rigidos, mas no demas parametros adaptables al Callback mismo.

Mira otro ejemplo para que veas que un Callback no es algo rigido:

En global fuctions:
function cbDelete(sSource, nDeleted, nTotal)
	sCurrentFile = String.SplitPath(sSource).Filename..String.SplitPath(sSource).Extension;
	nFileZise = File.GetSize(sSource);
	if (nFileZise ~= -1) then--Yo coloque esta sentencia porque en W8 me daba errores, no mostraba el peso del fichero.
		nFileFormat = String.GetFormattedSize(tostring(nFileZise), FMTSIZE_AUTOMATIC, true);
	else
		nFileFormat = "00.00 Kb";--Filtras el error
	end
	
	nDeleted = Math.Floor(nDeleted, 0);
	nTotal = Math.Floor(nTotal, 0);
	nPercentage = Math.Floor((nDeleted / nTotal * 100));
	Progress.SetRange("Progress2", 0, nTotal);
	
	Application.Sleep(1000);--Solo para apreciar el borrado de ficheros. No es recomendable exceder este valor de 400, si son demasiados ficheros la aplicacion tardara demasiado en eliminar todo.
	Paragraph.SetText("Paragraph1", "Borrado total al "..nPercentage.." %"..
									"\r\n"..
									"\r\nBorrando archivo "..sCurrentFile.." ["..nFileFormat.."]");
	Progress.SetCurrentPos("Progress1", nPercentage);
	Progress.SetCurrentPos("Progress2", nDeleted);	
	if (nDeleted == (nDeleted+nTotal)) then--La idea de Rafa es valida pero aqui estoy manejando valores absolutos sin margen de error. debes comprender el porque de los parentesis () ---> (nDeleted+nTotal)
		return false;--Ya no se ejecuta el Callback, osea todo ha sido eliminado.
	else
		return true;--Se sigue ejecutando el script del Callback.
	end
end
En boton, evento OnClick:
sFolder = Dialog.FolderBrowse("Please select a folder:", _DesktopFolder.."\\");
if (sFolder ~= "") and (sFolder ~= "CANCEL") then
	File.Delete(sFolder.."\\*.*", false, false, false, cbDelete);
	if (Application.GetLastError() == 0) then
		Paragraph.SetText("Paragraph1", "Borrado completo!")
		Application.Sleep(1500);
		Paragraph.SetText("Paragraph1", "");
	else
		Paragraph.SetText("Paragraph1", "Error al eliminar los ficheros del folder seleccionado!\r\nIntente de nuevo y si recibe este mensaje nuevamente trate ejecutando esta aplicacion con derechos de Administrador.")
	end
end
Prueba y veras que funciona muy semejante a lo que tu haces, yo lo hice asi porque en Windows 8 no me muestra los textos del Progress, no se si sea mi Sistema o es un problema general de W8.
Saludos ;)

Hola Metafunken!
Muchas gracias por la explicacion :) lo de la rigidez es verdad lo que dices, hasta hace nada lo decia por que al poner por defecto esos 3 parametros para la funcion file.delete pense que "coñazo, no hay mas parametros etc..." pero si es verdad lo que dices menos mal que se puede crear codigo personalizado jaja

Preguntas:
1- Siento curiosidad porque inicializas una variable numerica directamente dentro de una funcion como:
        nDeleted = Math.Floor(nDeleted, 0);
        nTotal = Math.Floor(nTotal, 0);
Es una forma abreviada de declarar variables numericas previas a su ejecucion algo asi como nDelete = 0;?

2- Lo del windows8 tengo curiosidad porque no lo tengo ( lo tuve en la empresa pero lo quitaron lololo) que pasa si le haces, para antes de comprobar su peso, un file.doesexist al archivo aprovechando su ruta completa en la variable sSource? Te lo detecta y te daria el peso del archivo?

Por lo demas, aunque lo he programado de distinta manera el tuyo es muy valido, hay muchas maneras de llegar a un mismo objetivo en la programacion eso es lo bueno. Lo malo es no recordar que coño era ese codigo si no dejo comentarios explicativos para entender su uso sobre todo las variables y tal... A veces mal acostumbro o olvido hacer uso de la notacion hungara o como se llame para ordenar de forma mental el significado de las variables, parametros etc...

Por cierto gracias por hacerme ver que win 8 tiene ese problema al describir el peso del archivo, lo digo porque estoy preparando un mega-ejemplo del uso del file.delete con sus progress en todas las variantes posibles. Tengo que revisarlo vaya a ser que haya gente que use el win8 (caca para mi lololo)

Gracias por tu asesoramiento colega! :yeah:

Antes que nada... Realmente es nada, a uno le da gusto el sentirse de verdad util, ahora, respuestas:

1. Lo que hago ahi es sobreescribir el valor de la variable de manera inmediata, puedes nombrarla de manera diferente claro y asi alojar dentro de si cierto valor, pero si no es tan drastico el que la sobreescribas de manera inmediata es valido hacerlo al momento, al mencionar drastico me refiero a, por ejemplo, manejando un gran codigo dentro del cual la misma variable debiera, por necesidades diversas, tener valores diferentes y ser asi utilizados segun tus necesidades, suele suceder.

En concreto, la funcion Math.Floor() lo que hace es "darnos" el numero mas bajo de cierto numero por si hubiera decimales en el, de esta manera evitamos errores de empatia entre la comparativa de valores obteniendo asi numeros enteros, si tuvieramos decimales en los valores habria errores de incongruencia y el codigo no se ejecutaria de manera factible provocando asi errores graves y molestos, tambien podria utilizarse el Math.Round() para controlar los decimales pero en este caso como estamos manejando un porcentaje lo mas certero es utilizar en Math.Floor().

El comienzo de la variable con una letra minuscula no es un estatuto realmente, pero sirve demasiado para recordar con que tipo de variable se esta trabajando, en este caso la letra o prefijo n se utiliza para denotar una variable del tipo number o numerica, asi sabemos que es una variable numerica y no la compararemos con una del tipo string, boolean o de tabla, esto anterior te recomiendo que se te haga costumbre o habito al trabajar con variables, de esta manera haras codigos mas limpios.

Por ahi tengo unos videos para principiantes en mi canal de youtube, a ver si luego le digo al buen Rafa que les de su visto bueno para colgarlos aqui, ahi hablo de todo ese rollo, en lo que lo hago podrias buscarlos para ver si te sirven de algo, estan explicados de manera muy facil de entender.

2. Ejecutando tu codigo en W8 tuve errores, no me muestra el peso de los ficheros, te regresa un -1 que es un valor, segun la funcion utilizada (File.GetSize()) de error, repito, no se si sea mi Sistema o es un error de Windows en general o sea la manera en la cual el Callback entrega la ruta hacia el fichero, la entrega al estilo de String.Mid(), por ejemplo...

La ruta normal hacia cualquier fichero es:

C:\Program Files\Mi Carpeta\Mi Otra Carpeta\Mi fichero.exe

Estamos?

Pues el Callback te la entrega asi:

C:\Program Files\Mi Carpeta\..\Mi fichero.exe

Osea, te acorta las rutas, es por esto que hay errores y la funcion File.GetSize() te regresa valor negativo... Pues como te daria un valor si no le estamos dando la ruta exacta? Que putada de ams no? Digo, si es de ams el error.

Finalmente te digo que he realizado el fix de las rutas de una manera muy sencilla, solo le agregas este codigo a la funcion y listo:
	sCurrentFile = String.SplitPath(sSource).Filename..String.SplitPath(sSource).Extension;
	tbFiles = File.Find(sFolder, sCurrentFile, false, false, nil, nil);
	if (tbFiles ~= nil) then
		for I, F in pairs(tbFiles) do
			sCurrentSource = F;
		end
	else
		sCurrentSource = sSource;
	end
	nFileSize = File.GetSize(sCurrentSource);
Asi ya no hay problema en Windows jodido 8 de mier...

Aqui te dejo la .apz para que la analices.

HIDE: ON
Hidebb Message Hidden Description


Saludos viejo ;)

thanks

Gracias por los consejos meta! muy util la explicacion :ohyeah:

Great Information ;)

Metafunken 10x...

:ohyeah:

interesante :yes: :yes:

thanks

---- :pc:
Gracias!