Función FileFind modificada [Actualizada]

Todas los scripts relacionados con AMS.
Muchas gracias por la explicación :sorry:

Pues preferiría si te es posible que sea insensible a mayúsculas y minúsculas. Así mostrara siempre todos los resultados. Pero si incluyes algún comando para que sea insensible o no, pues incluso mejor.
Ya le puse la opción para realizar la búsqueda sensitiva a mayúsculas y minúsculas y corregí lo de los comodines...En lo personal no me gusta mucho utilizar tantos comodines en una búsqueda pero bueno, cada quien jajaja:
--Función actualizada en el primer post
Ejemplo de uso:
--Ejemplo actualizado en el primer post
Gracias por el nuevo código.

Perdona que vuelva a molestarte, pero sigue sin funcionarme correctamente. Por ejemplo, la búsqueda de "Nuevo*.*" no funciona. O buscando archivos concretos tampoco funciona, ejemplo "Nuevo Documento de texto.txt".

Y si uso ".ex?" detecta archivos como "esfsdfsd.exe.manifiest".

Un saludo
Jajajaja, buscar "Nuevo*.*" es igual a buscar "Nuevo*." jajajajaja (aquí si te volaste la barda) por lo que buscar "Nuevo*.*" no funcionará (a menos de que me meta aún más al filtrado de comodínes). Ahora, recuerda que buscar "file.ex?" para un string.find es correcto encontrar "file.exe.manifiest" salvo que tu pongas el signo $ al final de tu búsqueda: "file.ex?$" lo cual le indicaría al lua que el comodín ? deberá ser el útlimo caracter de la búsqueda ;) .

Y lo que comentas de "Nuevo Documento de texto.txt" a mí si me da resultado, pero como sea trataré de ocasionar el fallo para ver que sale.
Hola

Estoy intentando usar la funcion callback, pero no consigo que me funcione bien. Me explico, la he tenido que meter en el codigo global, y he puesto un boton "cancelar" en la aplicacion, cuando se pulsa ese boton se escribe "si" en un label no visible. En la funcion callback esta puesto que mire ese texto y si es igual a "si" ejecute un Application.ExitScript().

El problema es que mientras esta escaneando el sistema (antes de cargar la tabla a añadir al listbox) no me permite pulsar el boton cancelar, se me bloquea la aplicacion.

Como comentaba en otro post, para evitar este tipo de cosas hay que recurrir al statusdlg... y es una jodienda. A ver si me puedes ayudar.

Un saludo y gracias
Modifique el último post por un error de dedo que tuve al copiar y pegar así sustituye la función que había puesto por la nueva.

Todas las funciones en lua bloquean las aplicaciones, lo que sospecho que sucede con el status dialog es que cada que inicia suspende la ejecución de las funciones por periodos cortos de tiempo en busca de recibir el comando de cuando se presiona "CANCEL". Es como una corutina que se pausa (coroutine.yield) cada vez que es llamada.

Veré si puedo hacer algo similar a ello pero que pueda recibir la acción de cancelar desde cualquier botón o label o lo que sea.
webultra escribió:Modifique el último post por un error de dedo que tuve al copiar y pegar así sustituye la función que había puesto por la nueva.

Todas las funciones en lua bloquean las aplicaciones, lo que sospecho que sucede con el status dialog es que cada que inicia suspende la ejecución de las funciones por periodos cortos de tiempo en busca de recibir el comando de cuando se presiona "CANCEL". Es como una corutina que se pausa (coroutine.yield) cada vez que es llamada.

Veré si puedo hacer algo similar a ello pero que pueda recibir la acción de cancelar desde cualquier botón o label o lo que sea.
Muchas gracias, eso seria increíble. Aunque la mayor dificultad (supongo yo, desde mi ignorancia) seria poder "activar" el botón cancelar, ya que cuando pulso el botón de búsqueda todo se queda congelado. Una minipausa para poder hacer acciones haría mas lento el escaneo, claro, pero quedaría muchísimo mejor que con el statusdlg.
Mmm...mi deducción es hacer un progress que trabajase como el status dialog. Creo por ahi alguien estaba desarrollando un progressEx pero no se se trae una función parecida al botón cancel del status. Por lo pronto veré un script llamado box (creo asi se llama) que al parecer ejecuta una función sin bloquear la aplicación. Comentarios más adelante jeje.
El progressex es solo una barra de progreso con alguna opcion mas (sin borde y mas colores degradados).

Mantenme informado de como avanzas en el tema, es por esperarme a ver si consigues algo (que seria genial) o finalmente usar el statusdlg. Porque no hay otra solución.
A lo que ví del Box...es que usa el global timer para ejecutar (con loadstring) la función programada....Veré si esa podría ser una forma de detener el proceso además de evitar inhibir la aplicación.
Pues no veo muy buen sistema eso que comentas del box, ya que ya utilizo el timer para otras cosas... ¿el coroutine no funcionaria bien?

Un saludo
Las corutinas no son procesos que se puedan ejecutar en paralelo con otras, ya que no regresan al thread principal hasta no terminar o pausar dicha corutina. Ejecutándolas desde un timer es que se puede manipular su comportamiento, ya que el timer es en realidad un proceso paralelo y la corutina se ejecutaría bajo de él y no bajo el proceso principal (también cualquier otra función).

El Box requiere del plugin global timer, el cual crea procesos en paralelo. Éste timer global es un proceso distinto al timer del ams, por lo que no habría problema con tus funciones alojadas en el timer del ams.

Justo en otro tema del foro de discusiones es que estoy viendo lo de crear nuevos procesos paralelos al proceso de tu aplicación. Ello a través de la función CreateProcess del kernel32
Cerraré mi participación en el foro culminando con este tema ya que aass ha seguido de cerca el desarrollo de ésta función. Va por tí ;)

Ya logré hacer una aplicación multithread en ams, y justo probé la función del filefind que hice y va de 10. Mientras busca los archivos puedes seguir haciendo otras cosas. Creo usaré un script que hice hoy y que sirve para controlar los timers del ams, lo cual me ayudará de alguna a crear una especie de callback (sólo para saber cuando termina) para el filefind.

Como ahora es multithread no tendrás necesidad de un botón para cancelar la búsqueda. La verdad no quisiera meterle un callback para mostrar el progreso de la búsqueda, ya que eso ha demostrado alentar cualquier función. Y repito, siendo multithread ni notarás que esta buscando jejeje.

Sólo deja termino de acomodar los 3 scripts y los 2 módulos que se requieren para ésto, en un plugin que ojala sirva para más cosas a futuro.

Por cierto, el dato para quienes quieran hacer funciones multithread es: lua lanes module ;)
:num1: :num1: :num1: :num1:

Wow muchísimas gracias de verdad!

Aunque si te fuese posible poder añadir la opcion de poder establecer un botón de cancelar (cuando digo boton, también me refiero a cualquier cosa que se quiera usar, un label, una barra de progreso o cosas asi). seria genial.

Crees que seria posible con ese sistema que tienes poder escanear partes del registro (Con registry.getkeynames) sin que se bloquee la aplicacion y con una barra de progreso o boton de cancelar o algo?

Muchas gracias, estoy deseando poder probarlo.
Holaa

¿Como vas avanzando?

He mirado el Lua Lanes asi por encima, pero como no tengo ni puta idea :) :sorry: no se como usarlo. He visto que tiene la funcion de ver el estado (ejecutando, parado, cancelado, etc). Se me ocurre que para hacer una forma simple de cancelarlo seria poner un timer y que cada segundo mire el estado (esto lo puede poner cualquiera, no es necesaria una funcion integrada) y por ejemplo, si ponemos un label que ponga "cancelar" y el timer cancele la accion.

No se, te hablo desde la ignorancia. Es una sugerencia.

Un saludo
Disculpa, la verdad he estado algo ocupo y no había podido poner aquí la función para tí. Algo que me emocionó con lua lanes fue que si antes mi función FileFind tardaba escasos 28segundos en buscar todas las dll, dat y exe del directorio de windows (poco más de 1400 archivos) ahora tarda menos de 3 SEGUNDOS, lo cual es impresionante y de locos jajaja (ejecutado en el core de lua tardó sólo 1.6 segundos).

Ahora, un thread creado con lanes no se puede creado sino es a través de un linda object. Pero no veo la necesidad de cancelar subprocesos que tardan muy poco en concluir, salvo que se tratase de un subproceso infinito al estilo de las corutinas de evaluación.

Por cierto, no hay callback ya que no existe comunicación al exterior, ni interior, de un lane sino es con linda objects. Pero, ¿para qué un callback de 3segundos? jajajaja

Sin más preámbulo, te dejo mi función especialmente terminada para vos:
--Globals
require"lanes";
function fFileFind(sPath, tSearch, bSubFolders, bCaseSensitive, tToAdd)
	require"lfs";
	function FileFindA(sPath, tSearch, bSubFolders, bCaseSensitive, tToAdd)
		local tS = (type(tSearch=="table")) and tSearch or {""};
		local bC = bCaseSensitive or false;
		if #tS > 0 then
			for x, y in pairs(tS) do
				local a = (bC==true) and y or string.gsub(y, "(.)", function(s) return string.lower(s) end);
				a = string.gsub(a, "(.)*(.)", function(s, sa) return "%b"..s..sa end);
				a = string.gsub(a, "*(..)", function(s) return "%b"..s end);
				a = string.gsub(a, "(..)(.)%.", function (s, ss) return (s=="%b") and s..ss.."." or s..ss.."%." end)
				a = string.gsub(a, "^%.", "%%.")
				tS[x] = string.gsub(a, "?", ".");
			end
		end
		return FileFindB(sPath, tS, bSubFolders, bC, tToAdd);
	end
	function FileFindB(sPath, tSearch, bSubFolders, bCaseSensitive, tToAdd)
		local tReturn = (type(tToAdd)=="table") and tToAdd or {};
		local tDirs = {};
		if lfs.chdir(sPath) then
			for x in lfs.dir(sPath) do
				if x ~= "." and x ~= ".." then
					if lfs.attributes(x, "mode") == "file" then
						for y, z in pairs(tSearch) do
							local a = (bCaseSensitive==false) and x or string.gsub(x, "(.)", function(s) return string.lower(s) end);
							if string.find(a, z) then
								table.insert(tReturn, #tReturn+1, sPath.."\\"..x);
							end
						end
					elseif lfs.attributes(x, "mode") == "directory" then
						if bSubFolders then
							table.insert(tDirs, #tDirs+1, sPath.."\\"..x);
						end
					end
				end
			end
			if #tDirs > 0 and bSubFolders then
				for x, y in pairs(tDirs) do
					FileFindB(y, tSearch, true, bCaseSensitive, tReturn);
				end
			end
			return (#tReturn>0) and tReturn or nil;
		else
			return nil;
		end
	end
	
	return FileFindA(sPath, tSearch, bSubFolders, bCaseSensitive, tToAdd)
end
local FileFind = lanes.gen("*", fFileFind)
--On Click in a button
tFiles = FileFind("C:\\Windows", {".dat", "*.dll", "s*.exe"}, true, false, nil);
-On click in other label or timer
Debug.ShowWindow(true);
if tFiles.status == "done" then
	if tFiles[1] then
		Debug.Print("Files: "..#tFiles[1].."\r\n"..ptbl(tFiles[1]));--Busca mi función de imprimir tablas
	else
		Dialog.Message("", "NoFiles");
	end	
elseif tFiles.status == "error" then
	local a, e = tFiles:join()
	Debug.Print(tostring(e));
else
	Debug.Print("Status: "..tFiles.status.."\r\n");
end
Hola

Gracias por el script. ¿podrías poner la descarga del "lanes"? (supongo que sera una dll o algo).

Necesito usar funciones que llevan bastante tiempo, 10 minutos o asi. Aunque claro, no lo he probado como subproceso. Pero necesito la posibilidad de poder parar ese subproceso. Solo necesito que me indiques el comando para detenerlo. No necesito una funcion callback.

Muchas gracias.
Te dejo aca las dlls (lfs y lanes). Por lo que veo quieres hacer una especie de tabla del registro de windows y bien se podría usar para comparar cambios en el mismo. Pero de antemano te aviso que no puedes usar las funciones del ams dentro de un lane, pero no significa que no exista solución. Por mi parte concluyo con esto lo que tenia pendiente contigo:

HIDE: ON
Hidebb Message Hidden Description
Pero a ver si lo entiendo. Esta funcion se ejecuta en un subproceso. Por tanto ¿la aplicacion no se bloquea y se puede continuar usando? ¿No hay ninguna forma posible de poder cancelar el subproceso ni de acceder a su informacion (como con un comando tipo get.status?) e ir verificando con un timer si esta o no en "running"?

Muchas gracias por todo.
voy a probar lanes con linda, por el tema de hablar entre threads, hay que tener cuidado con el uso de ciertas funciones en un proceso y otro a la vez, porque se solapan resultados...