cambiar atributos de archivo

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
rambaro
Mensajes: 6
Registrado: 11 Nov 2010, 03:40

cambiar atributos de archivo

Mensaje por rambaro »

hola soy nuevo en autoit y estaba haciendo este pequeño y sencillo escript entonces que quisiera saber

Código: Seleccionar todo

#include <GUIConstants.au3>

#Region ### START Koda GUI section ### 
$Form1_1 = GUICreate("Desocultador de documentos", 330, 269, 193, 125)
GUISetBkColor(0xFFFFFF)
$Group1 = GUICtrlCreateGroup("", 8, 8, 313, 217)
$Label1 = GUICtrlCreateLabel("Desoculador de documentos", 144, 24, 140, 17)
$Pic1 = GUICtrlCreatePic("C:\fatpart\script\jerry.jpg", 16, 24, 105, 100)
$Label2 = GUICtrlCreateLabel("Verson : 2.0", 144, 48, 61, 17)
$Label3 = GUICtrlCreateLabel("Por una informatica libre de virus", 144, 72, 157, 17)
$Label4 = GUICtrlCreateLabel("Desea proceder a corregir todos los ", 88, 136, 175, 17)
$Label5 = GUICtrlCreateLabel("Archivos ocultos en este direcctorio", 88, 160, 172, 17)
$Label6 = GUICtrlCreateLabel("Hecho por Rambaro", 144, 96, 100, 17)
$Button3 = GUICtrlCreateButton("Si", 112, 184, 41, 25, 0)
$Button1 = GUICtrlCreateButton("No", 184, 184, 41, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Progress1 = GUICtrlCreateProgress(24, 232, 281, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Button3
		RunWait(@ComSpec &  ' /c attrib -h -r -s *.* /s /d',"",@SW_HIDE)
//que mientras esto Se ejecute la barra de progrso alla trabajando con ella hasta que termine esa instrucion como hago
			
	msgbox("*","Info","Corregido Correctamente",3)
		ExitLoop
Case $Button1
	Exit
EndSwitch
WEnd


gracias de antemano
Última edición por rambaro el 17 Nov 2010, 21:09, editado 4 veces en total.
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: ayuda con este pequeño script

Mensaje por Alastor »

Ese comando (que yo sepa) es casi instantaneo y no le veo sentido a ponerle una barra de progreso (ya que duraría 1 segundo)

PD: Los códigos deberias ponerlos entre etiquetas code:

Código: Seleccionar todo

[code]Aqui tu codigo
[/code]
Aprendiendo AutoIt y C++
rambaro
Mensajes: 6
Registrado: 11 Nov 2010, 03:40

Re: ayuda con este pequeño script

Mensaje por rambaro »

si se a lo que te refieres lo que pasa es cuando lo haces en un pendrive de 8gb la gente piensa que se colgó pòr lo que dura como un minuto por eso lo de colocarle la barrita ...
Avatar de Usuario
XPyro
Profesional del Autoit
Mensajes: 542
Registrado: 04 Mar 2007, 10:12
Ubicación: México
Contactar:

Re: ayuda con este pequeño script

Mensaje por XPyro »

Tengo un programita parecido y puede ser de mucha ayuda para lo que deseas realizar, esta un poco grande el código pero si te atoras puedes preguntar :smt002

http://www.emesn.com/autoitforum/viewto ... 90&start=0
Imagen
rambaro
Mensajes: 6
Registrado: 11 Nov 2010, 03:40

Re: ayuda con este pequeño script

Mensaje por rambaro »

xpyro ya vi tu programa si me gusto pero para lo que necesito no me sirve por que no es para manejar por mi sino por unos usuarios donde yo trabajo por que se volverian un ocho por eso lo hice asi lo que pasa es que aveces algunos de los usuarios llevan sus memorias usb a sus casas y lo regresan con el virus que oculta los documentos y carpetas el antivirus lo detecta pero como el archivo que contamina los demás se protege con atributos de sistema el antivirus borra sus variantes mas no el principal ya eh intentado con varios antivirus y nada todo igual, la solución fue cambiar los atributos a a todos los archivos así los que el virus oculta aparecen y el causante del problema al quitarle el atributo del sistema el antivirus lo borra de una y listo, al principio le explicaba a cada usuario como hacer pero terminaban embarradola por eso lo hice así automático mas nada que lo pegaran en su pendrive y lo ejecutaran y ya, ahora el prolema fue que cuando lo colocan en pendrives con mucha información o muy grandes el programa tarda y mas de uno se quejaba por que pensaban que se colgaba que no servia y mas, por eso la idea de colocarle la dichosa barra así me quito las quejas y listo muy agradecido si me pudieras ayudar...
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: ayuda con este pequeño script

Mensaje por Alastor »

Creo XPyro quiere decir que estudies un poco su programa y lo apliques a lo que quieres hacer, no que uses el suyo directamente. Tu estudialo con calma y si tienes algun problema simplemente pregunta. Si tengo tiempo te haré un prototipo yo mismo.
Aprendiendo AutoIt y C++
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ayuda con este pequeño script

Mensaje por Chefito »

Pienso lo mismo. Estudia el ejemplo que te han dicho y utiliza lo que necesites del código. Si no entiendes algo dilo.

Respecto a tu código....mmmm.....lo primero que tienes que hacer es cambiar el runwait por run, ya que el runwait para el script hasta que se ejecute lo que le has dicho. Por esa causa no vas ha poder hacer nada mientras se esté ejecutando el attrib.

Después del run tendrás que hacer algún bucle donde detectes el final de la ejecución del attrib. Esto lo puedes hacer mirando cada poco tiempo el texto de la ventana command (ejemplo con StdoutRead), o más facil aun, con el título de la ventana command, ya que al ejecutar un comando se pone en el título, y al acabar se quita, o comprobando el proceso que genera el comando attrib (attrib.exe) utilizando ProcessExists. Como ves tienes muchas posibilidades para comprobar la finalización del attrib.
Dentro de este bucle, también puedes meter algo que indique al usuario que está ejecutándose el comando. Puede ser como tu dices una barra de proceso, un contador, etc. Lo malo es que no sabes la duración del proceso, por eso no vas ha poder poner la típica barra de proceso exacta.

Prueba cosas, haz código, y si te atascas en algo no dudes en decirlo.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: ayuda con este pequeño script

Mensaje por Alastor »

No es la mejor forma de hacerlo (Solo tenía 20 minutos), pero puedes usar esto:

Código: Seleccionar todo

#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.6.1
	Author:         Alastor

	Script Function:
	Ejemplo de como modificar los atributos de una carpeta usando una barra de progreso.

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Directorio = @ScriptDir & "\"


#region GUI_Main
$GUI_Main = GUICreate("", 569, 189, 192, 124)
$Group_Progress = GUICtrlCreateGroup("Progreso", 8, 80, 545, 49)
$Progreso = GUICtrlCreateProgress(16, 96, 529, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Comenzar = GUICtrlCreateButton("Comenzar", 8, 16, 147, 49, $WS_GROUP)
GUICtrlSetFont($Comenzar, 16, 400, 0, "Courier New")
GUICtrlSetColor($Comenzar, 0x800000)
$Cancelar = GUICtrlCreateButton("Cancelar", 400, 16, 147, 49, $WS_GROUP)
GUICtrlSetFont($Cancelar, 16, 400, 0, "Courier New")
GUICtrlSetColor($Cancelar, 0x800000)
$CActual = GUICtrlCreateLabel("Carpeta actual: " & $Directorio, 8, 136, 548, 17)
$Autor = GUICtrlCreateLabel("Hecho por Alastor", 384, 168, 89, 17)
GUICtrlSetState($Autor, $GUI_DISABLE)
$Version = GUICtrlCreateLabel("[AutoIt 3.3.6.1]", 480, 168, 74, 17)
GUICtrlSetState($Version, $GUI_DISABLE)
#endregion GUI_Main

GUISetState(@SW_SHOW)


While 1

	Switch GUIGetMsg()

		Case $GUI_EVENT_CLOSE
			Exit 0

		Case $Comenzar

			Local $P = 0

			GUICtrlSetData($Progreso, 0)

			; Archivos y carpetas en el directorio actual
			$search = FileFindFirstFile("*.*")

			If $search = -1 Then ; No hay resultados o errores?
				MsgBox(0, "Error", "No hay archivos/carpetas en este directorio")
				Exit
			EndIf

			While 1
				$file = FileFindNextFile($search) ; Siguiente
				If @error Then ExitLoop

				If DirGetSize($Directorio & $file, 2) = -1 Then ; Si es un archivo:
					FileSetAttrib($Directorio & $file, "-SHR", 0)

				Else ; Si es una carpeta
					FileSetAttrib($Directorio & $file & "\*.*", "-SHR", 1)
				EndIf

				$P += 1 ; Aumentar el progreso
				GUICtrlSetData($Progreso, $P)
			WEnd

			; Terminar la busqueda
			FileClose($search)

			GUICtrlSetData($Progreso, 100)

			MsgBox(0, "Estado", "Finalizado con exito", 0)

			Exit 0

		Case $Cancelar
			Exit 0

	EndSwitch
WEnd
Si, ya se que la barra tiene un máximo de 100 y que no será exacta si hay mas de 100 archivos/carpetas en el directorio actual, pero creo que te puede servir.
Aprendiendo AutoIt y C++
rambaro
Mensajes: 6
Registrado: 11 Nov 2010, 03:40

Re: ayuda con este pequeño script

Mensaje por rambaro »

gracias a todos ya lo pude solucionar el código que coloco Alastor me ayudo bastante, y pues no pude ver fue lo que coloco Xpyro por que en ningún lado vi el codigo solo estaba el exe en el enlace que dejo de todos modos gracias a todos .... y viva la informatica libre de virus :smt003
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ayuda con este pequeño script-- solucionado

Mensaje por Ximorro »

Muy buen trabajo Alastor, creo que es la mejor manera de atacar el problema más fácilmente: ¡hacerlo en AutoIt!

El problema del sistema original era el RunWait, al dejar que haga la tarea un comando shell es mucho más difícil de controlar. Como decía Chefito una manera es ir controlando la salida estándar del comando, o quizás ir monitorizando la carpeta en cuestión a ver qué va cambiando... Usar comandos shell es genial pero cuando quieres controlarlos de esa manera la cosa se complica.

Al hacerlo en puro autoit es mucho más controlable. Por cierto, no es ningún problema que no haya 100 archivos, (lo de Alastor también fallaría si hay menos de 100), así que lo que hay que hacer es hacerlo proporcional.
Hay que tener el valor final que buscamos ($total) (en este caso el número de archivos/carpetas a modificar) e ir contando cuántos vamos cambiando ($hecho), así, el valor del progressbar en un momento dado es:
GUICtrlSetData($Progreso, $hecho / $total * 100)


Por cierto rambaro, si tu solución modifica/mejora/amplía de alguna manera interesante el código de Alastor deberías ponerlo, así aprenderemos todos, ya que has conseguido la solución es buena idea compartirla con todos.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
rambaro
Mensajes: 6
Registrado: 11 Nov 2010, 03:40

Re: ayuda con este pequeño script-- solucionado

Mensaje por rambaro »

hola Ximorro estoy tratando de hacer lo que dijiste pero no se como lo que intente hacer fue agregar después de cada proceso un contador para saber cuantas veces hace el proceso algo asi

Código: Seleccionar todo

If DirGetSize($Directorio & $file, 2) = -1 Then ; Si es un archivo:
               FileSetAttrib($Directorio & $file, "-SHR", 0 )
			$A=$A+1
            Else ; Si es una carpeta
               FileSetAttrib($Directorio & $file & "\*.*", "-SHR", 1 )
			$B=$B+1
            EndIf
después las sumo $C = $A+$b y tendría el total si es asi ?
este comando FileSetAttrib($Directorio & $file & "\*.*", "-SHR", 1 ) lo que hace es cambiar los attributos en un directorio x y hasta que no termina no pasa a otro ? es asi
.. gracias perdonen si la pregunta es muy tonta es que estoy aprendiendo
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: ayuda con este pequeño script-- de nuevo

Mensaje por Alastor »

Creo que me he complicado un poco la vida con el script:

Código: Seleccionar todo

#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.6.1
	Author:         Alastor

	Script Function:
	Ejemplo de como modificar los atributos de una carpeta usando una barra de progreso.

#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $Directorio = @ScriptDir & "\"

#Region GUI_Main
$GUI_Main = GUICreate("", 569, 189, 192, 124)
$Group_Progress = GUICtrlCreateGroup("Progreso", 8, 80, 545, 49)
$Progreso = GUICtrlCreateProgress(16, 96, 529, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Comenzar = GUICtrlCreateButton("Comenzar", 8, 16, 147, 49, $WS_GROUP)
GUICtrlSetFont($Comenzar, 16, 400, 0, "Courier New")
GUICtrlSetColor($Comenzar, 0x800000)
$Cancelar = GUICtrlCreateButton("Cancelar", 400, 16, 147, 49, $WS_GROUP)
GUICtrlSetFont($Cancelar, 16, 400, 0, "Courier New")
GUICtrlSetColor($Cancelar, 0x800000)
$CActual = GUICtrlCreateLabel("Carpeta actual: " & $Directorio, 8, 136, 548, 17)
$Autor = GUICtrlCreateLabel("Hecho por Alastor", 384, 168, 89, 17)
GUICtrlSetState($Autor, $GUI_DISABLE)
$Version = GUICtrlCreateLabel("[AutoIt 3.3.6.1]", 480, 168, 74, 17)
GUICtrlSetState($Version, $GUI_DISABLE)
#EndRegion GUI_Main

GUISetState(@SW_SHOW)


While 1

	Switch GUIGetMsg()

		Case $GUI_EVENT_CLOSE
			Exit 0

		Case $Comenzar

			GUICtrlSetData($Progreso, 0)

			$Total = _CountFilesNFolders($Directorio, 1)

			_SetFilesNFoldersAttr($Directorio, "-SHR", $Progreso, 0, $Total, 1)

			GUICtrlSetData($Progreso, 100)

			MsgBox(0, "Estado", "Finalizado con exito", 0)

			Exit 0

		Case $Cancelar
			Exit 0

	EndSwitch
WEnd

Func _CountFilesNFolders($Dir, $Recursive = 0)
	Local $Count = 0

	$search = FileFindFirstFile($Dir & "*.*") ; Archivos y carpetas en el directorio

	If $search = -1 Then ; ¿No hay resultados o hay errores?
		SetError(-1)
		Return 0
	EndIf

	While 1
		$file = FileFindNextFile($search) ; Siguiente
		If @error Then ExitLoop ; ¿Quedan archivos?

		If DirGetSize($Dir & $file, 2) = -1 Then ; Si es un archivo:
			$Count += 1

		Else ; Si es una carpeta
			$Count += 1
			If $Recursive = 1 Then
				$Count = $Count + _CountFilesNFolders($Dir & $file & "\", 1)
			EndIf

		EndIf

	WEnd

	; Terminar la busqueda
	FileClose($search)

	Return $Count
EndFunc   ;==>_CountFilesNFolders

Func _SetFilesNFoldersAttr($Dir, $Attr, ByRef $Progress, $Progress_Start, $Max_Progress, $Recursive = 0)
	Local $Count = 0

	$search = FileFindFirstFile($Dir & "*.*") ; Archivos y carpetas en el directorio

	If $search = -1 Then ; ¿No hay resultados o hay errores?
		SetError(-1)
		Return 0
	EndIf

	While 1
		$file = FileFindNextFile($search) ; Siguiente
		If @error Then ExitLoop ; ¿Quedan archivos?

		If DirGetSize($Dir & $file, 2) = -1 Then ; Si es un archivo:
			FileSetAttrib($Dir & $file, $Attr, 0)
			$Count += 1
			GUICtrlSetData($Progress, ($Progress_Start + $Count) / $Max_Progress * 100)

		Else ; Si es una carpeta
			$Count += 1

			If $Recursive = 1 Then
				FileSetAttrib($Dir & $file & "\*.*", $Attr, 0)
				$Count = $Count + _SetFilesNFoldersAttr($Dir & $file & "\", $Attr, $Progress, $Count, $Max_Progress, 2)

			ElseIf $Recursive = 2 Then
				$Count += 1
				FileSetAttrib($Dir & $file & "\*.*", $Attr, 1)

			ElseIf $Recursive = 0 Then
				FileSetAttrib($Dir & $file & "\*.*", $Attr, 0)

			EndIf

			FileSetAttrib($Dir & $file, $Attr, 0)

			GUICtrlSetData($Progress, ($Progress_Start + $Count) / $Max_Progress * 100)

		EndIf

	WEnd

	; Terminar la busqueda
	FileClose($search)

	Return $Count
EndFunc   ;==>_SetFilesNFoldersAttr
La primera función cuenta la cantidad total de archivos/carpetas mediante recursividad, y la segunda es la que pone los atributos cambiando la barra de progreso y teniendo en cuenta el total (tambien recursiva)
Seguro que se puede hacer mucho mas simple, pero ahora no se me ocurria otra forma :smt017
Si tienes alguna duda respecto al codigo, simplemente pregunta :smt001
Aprendiendo AutoIt y C++
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ayuda con este pequeño script-- de nuevo

Mensaje por Ximorro »

Ya te ha contestado Alastor, que es una máquina. :smt004
Efectivamente en este caso no era fácil conocer el valor de archivos a cambiar, el sistema recursivo de Alastor es genial (eso sí, ojo con las llamadas recursivas en AutoIt que están limitadas). Otra manera "menos AutoIT" sería hacer una llamada al shell con un "DIR /s" y leer la salida estándar para ver cuántos archivos saca.

Por cierto, que otro truco, para cuando sea muy difícil o imposible saber la cantidad de elementos a procesar es no hacer una barra de estado de porcentaje. En esos casos se puede hacer una barra que simplemente se vaya moviendo adelante y atrás, así el usuario ve que se está haciendo algo, aunque no sepa cuándo se va a terminar. También se puede añadir un label que se vaya actualizando con el número de archivos procesados, así aunque no se sepa cuándo va a acabar (pues no se sabe cuántos son) el usuario sí ve cómo se va procesando.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: ayuda con este pequeño script-- de nuevo

Mensaje por Ximorro »

rambaro, te recomiendo, casi suplico, que cambies el título del post para que este hilo pueda ser más fácil de encontrar para todos los usuarios. Algo descriptivo tipo "Cambiar atributos de archivos recursivamente" o algo así.
Piensa que por ejemplo este script es muy útil para recorrer sistemas de archivos (para cambiar atributos o realizar cualquier proceso) y cuando haya usuarios buscando este tipo de problemas no van a hacer una búsqueda con el texto "ayuda con pequeño script", lógicamente, más bien buscarán "recorrido de archivos recursivo" si buscan algo general, o "cambiar atributos de archivo" si buscan este caso en particular.

Igualmente para nuevos post recuerda poner un título adecuado, además así es más fácil que recibas ayuda, la gente colabora desinteresadamente y no siempre hay tiempo para mirarlo todo, así que es fácil que ni siquiera se entre en posts cuyo título no te dice nada.

Talueec
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ayuda con este pequeño script-- de nuevo

Mensaje por Chefito »

Alastor, a mi también me ha gustado mucho tu código :smt001 . Sobre todo la función recursiva para mirar los archivos que hay en un directorio :smt023 . Esa función es genial! En su día hicimos funciones para hacer eso, pero por ejemplo no se nos ocurrió utilizar DirGetSize para determinar si es era un archivo o una carpeta. Tiene que ser el más rápido que se ha hecho :smt023 . Seguramente lo adapto para una función de búsqueda de ficheros que necesito :smt023 .

Por cierto, para saber rápidamente el número de archivos y directorios que posee una unidad o directorio, utilizar la función DirGetSize(Unidad o directorio,1). Mirar en la ayuda:
flag: 1 = Extended mode is On -> returns an array that contains extended information (see Remarks).

If you use the extended mode then the array returned from this function is a single dimension array containing the following elements:
$array[0] = Size
$array[1] = Files count
$array[2] = Dirs Count
Ejemplo para saber el número de archivos y carpetas de la unidad c:\ :

Código: Seleccionar todo

$v=DirGetSize("c:\",1)
msgbox(0,"","Número de archivos: " & $v[1] & " , Número de directorios: " &$v[2])
Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: ayuda con este pequeño script-- de nuevo

Mensaje por Alastor »

Chefito escribió:Alastor, a mi también me ha gustado mucho tu código :smt001 . Sobre todo la función recursiva para mirar los archivos que hay en un directorio :smt023 . Esa función es genial! En su día hicimos funciones para hacer eso, pero por ejemplo no se nos ocurrió utilizar DirGetSize para determinar si es era un archivo o una carpeta. Tiene que ser el más rápido que se ha hecho :smt023 . Seguramente lo adapto para una función de búsqueda de ficheros que necesito :smt023 .
Me alegro de que te sirva, se me ocurrió hacerla durante la clase de programación :smt024 (¿Pará que voy a atender, si lo maximo que se da es printf()? :smt005 )
Chefito escribió: Por cierto, para saber rápidamente el número de archivos y directorios que posee una unidad o directorio, utilizar la función DirGetSize(Unidad o directorio,1). Mirar en la ayuda:
flag: 1 = Extended mode is On -> returns an array that contains extended information (see Remarks).

If you use the extended mode then the array returned from this function is a single dimension array containing the following elements:
$array[0] = Size
$array[1] = Files count
$array[2] = Dirs Count
Ejemplo para saber el número de archivos y carpetas de la unidad c:\ :

Código: Seleccionar todo

$v = DirGetSize("c:\",1)
MsgBox(0, "", "Número de archivos: " & $v[1] & " , Número de directorios: " &$v[2])
Saludos.
Ya me imaginaba que habria alguna forma de hacerlo de forma mas sencilla, pero no encontré ninguna funcion para ello, gracias por la información.

PD: De todas formas, he hecho un test a ver cuanto tardaban de diferencia en contar los archivos/carpetas de la carpeta \WINDOWS:
Imagen
Mi funcion solo tarda 13ms más que la funcion :smt003
Aprendiendo AutoIt y C++
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: ayuda con este pequeño script-- de nuevo

Mensaje por Chefito »

Alastor escribió:Me alegro de que te sirva, se me ocurrió hacerla durante la clase de programación (¿Pará que voy a atender, si lo maximo que se da es printf()? )
Sí, me servirá, ya que yo hace mucho tiempo hice unas recursivas pero se perdieron los post del foro. Encontré algunos códigos que más tarde colgé, pero las he vuelto a revisar y tienen fallos. No se si es que no eran los código finales :smt013 . Además, ahora que se bastante más las optimizaría bastante :smt005 .

Jajajaja....lo de las clases.....ya te digo, algunas son un coña........ :smt005 .
Alastor escribió:Mi funcion solo tarda 13ms más que la funcion
Perdona de discrepe, pero si hay bastante diferencia :smt016 . Si haces un estudio no lo hagas tan simple :smt005 .

Tengo un portatil nuevo, pero para estas cosas prefiero utilizar el p4 1600 mhz :smt002 . Estos son los resultado en este ordenador con win xp. Estos son los códigos que he corrido:
CODIGO 1:

Código: Seleccionar todo

Func _CountFilesNFolders($Dir, $Recursive = 0)
   Local $Count = 0

   $search = FileFindFirstFile($Dir & "*.*") ; Archivos y carpetas en el directorio

   If $search = -1 Then ; ¿No hay resultados o hay errores?
      SetError(-1)
      Return 0
   EndIf

   While 1
      $file = FileFindNextFile($search) ; Siguiente
      If @error Then ExitLoop ; ¿Quedan archivos?

      If DirGetSize($Dir & $file, 2) = -1 Then ; Si es un archivo:
         $Count += 1

      Else ; Si es una carpeta
         $Count += 1
         If $Recursive = 1 Then
            $Count = $Count + _CountFilesNFolders($Dir & $file & "\", 1)
         EndIf

      EndIf

   WEnd

   ; Terminar la busqueda
   FileClose($search)

   Return $Count
EndFunc   ;==>_CountFilesNFolders

ConsoleWrite(_CountFilesNFolders("h:\",1))
CODIGO 2:

Código: Seleccionar todo

$v = DirGetSize("h:\",1)
ConsoleWrite("Número de archivos: " & $v[1] & " , Número de directorios: " &$v[2])
Te informo que la unidad H es un disco externo usb de 1 tera casi lleno :smt005 .

Resultados:

1º ejecucion CODIGO 1: Número de archivos: 361128 , Número de directorios: 25601>Exit code: 0 Time: 115.328

1º ejecucion CODIGO 2: 386729>Exit code: 0 Time: 173.208

2º ejecución CODIGO 1: Número de archivos: 361128 , Número de directorios: 25601>Exit code: 0 Time: 12.532

2º ejecución CODIGO 2: 386729>Exit code: 0 Time: 172.958

Que deducimos con esto??? Que la función DirGetSize es bastante más rápida :smt002 .
Otra cosa que vemos, que esta función aprovecha .... un buffer???? o algo respecto a la primera ejecución, y reduce considerablemente el tiempo en una misma búsqueda. Esto me hace pensar......y si el CODIGO 1 (tu función) aprovecha la 1º ejecución de la función dirgetsize???

Reinicio el ordenador:

CODIGO 2: 386729>Exit code: 0 Time: 245.053

CODIGO 1: Número de archivos: 361128 , Número de directorios: 25601>Exit code: 0 Time: 11.508

CODIGO 2: 386729>Exit code: 0 Time: 156.694

CODIGO 1: Número de archivos: 361128 , Número de directorios: 25601>Exit code: 0 Time: 11.056

Con esto vemos que los dos códigos se aprovechan de la primera ejecución de cada uno. Utilizaran métodos que se parezcan en algo o será casualidad??? :smt017 . Se podría seguir investigando, pero paso. Yo creo que ya está clara la cosa :smt016 .

Para mi que DirGetSize utilizará el método que utiliza win cuando le das a "propiedades" encima de una carpeta :smt017 .
Y piensa que seguramente esa función está muy bien definida, es nativa de AutoIt, y está creada en c o c++.

Por supuesto, cuanto más potente sea el ordenador y cuanto menos ficheros y carpetas haya, menor será la diferencia de tiempos entre los códigos.

Igualmente, muy buen trabajo. Se puede utilizar muy bien para búsqueda de ficheros y cosas así :smt023 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
rambaro
Mensajes: 6
Registrado: 11 Nov 2010, 03:40

Re: cambiar atributos de archivo

Mensaje por rambaro »

hola muchachos muchas gracias con la ayuda de todos creo que lo voy a dejar de esta forma revisenlo y me dicen utilice lo que dijo chefito con los array e hice asi

Código: Seleccionar todo

$v = DirGetSize(@ScriptDir & "\",1)
$c=$v[1]+$v[2]

Código: Seleccionar todo

GUICtrlSetData($Progreso, $P/$C *100)
asi la barra se incrementa de acuerdo a la cantidad de archivos ¿si estoy bien ? y a quedado asi

Código: Seleccionar todo

#include <GUIConstants.au3>
Global $Directorio = @ScriptDir & "\"
Global $C,$v
#Region ### START Koda GUI section ### Form=c:\users\jerry\downloads\utilidades\win\debian\fatpart\script\form2.kxf
$Form1_1 = GUICreate("Desocultador de documentos", 330, 269, 193, 125)
GUISetBkColor(0xFFFFFF)
$Group1 = GUICtrlCreateGroup("", 8, 8, 313, 217)
$Label1 = GUICtrlCreateLabel("Desoculador de documentos", 144, 24, 140, 17)
$Pic1 = GUICtrlCreatePic("C:\Users\jerry\Downloads\utilidades\win\debian\fatpart\script\jerry.jpg", 16, 24, 105, 100)
$Label2 = GUICtrlCreateLabel("Verson : 2.0", 144, 48, 61, 17)
$Label3 = GUICtrlCreateLabel("Por una informatica libre de virus", 144, 72, 157, 17)
$Label4 = GUICtrlCreateLabel("Desea proceder a corregir todos los ", 88, 136, 175, 17)
$Label5 = GUICtrlCreateLabel("Archivos ocultos en este direcctorio", 88, 160, 172, 17)
$Label6 = GUICtrlCreateLabel("Hecho por Rambaro con ayuda de chefito y alastor", 144, 96, 100, 17)
$Button3 = GUICtrlCreateButton("Si", 112, 184, 41, 25, 0)
$Button1 = GUICtrlCreateButton("No", 184, 184, 41, 25, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Progreso = GUICtrlCreateProgress(24, 232, 281, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


$v = DirGetSize(@ScriptDir & "\",1)
$c=$v[1]+$v[2]

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Button3
		 Local $P = 0

         GUICtrlSetData($Progreso, 0)

         ; Archivos y carpetas en el directorio actual
         $search = FileFindFirstFile("*.*")

         If $search = -1 Then ; No hay resultados o errores?
            MsgBox(0, "Error", "No hay archivos/carpetas en este directorio")
            Exit
         EndIf

         While 1
            $file = FileFindNextFile($search) ; Siguiente
            If @error Then ExitLoop

            If DirGetSize($Directorio & $file, 2) = -1 Then ; Si es un archivo:
               FileSetAttrib($Directorio & $file, "-SHR", 0)

            Else ; Si es una carpeta
               FileSetAttrib($Directorio & $file & "\*.*", "-SHR", 1)
            EndIf

            $P += 1 ; Aumentar el progreso
            GUICtrlSetData($Progreso, $P/$C *100)
         WEnd

         ; Terminar la busqueda
         FileClose($search)

         GUICtrlSetData($Progreso, 100)

         MsgBox(0, "Estado", "Finalizado con exito, se corrigieron " & $C & " archivos", 0 )

         Exit 0
Case $Button1
	Exit
EndSwitch
WEnd
otra pregunta como hago para que la imagen quede compilada con el exe
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: cambiar atributos de archivo

Mensaje por BasicOs »

HOla SI deseas hacer recursivo el programa para que se vaya desplazando por los subdirectorios, como opción, tienes aquí una función con un ejemplo:
Funcion recursiva para listar->Func _FileListToArray_Recursive()
Func _FileListToArray_Recursive($sPath, $sFilter = "*", $iRetItemType = 0, $iRetPathType = 0, $bRecursive = False)
Es un script con pocas lineas que te hace un listado de los ficheros, (pensado también para música, mp3..)

http://www.autoitscript.com/forum/files ... inventory/

Código: Seleccionar todo

#include <File.au3>
#include <GUIConstants.au3>
#include <Array.au3>

Global $temppath = @ScriptDir

GUICreate("Inventory", 320, 265, -1, @DesktopHeight/10)
GUICtrlCreateLabel("Inventory v1.03   -   Created by Rogue5099", 42, 5, 375, 20)
$Button_1 = GUICtrlCreateButton("Take Invenotry", 200, 34, 100, 50)
$Checkbox_1 = GUICtrlCreateCheckbox("Include Subfolders", 10, 30)
$Checkbox_2 = GUICtrlCreateCheckbox("Include Full File Path", 10, 55)
GUICtrlCreateLabel("File type to search for. i.e. .jpg,.mp3 (Seperate /w Comma):", 8, 97, 325, 20)
Global $Input3 = GUICtrlCreateInput("*.*", 25, 117, 240, 20)
GUICtrlCreateLabel("Save Inventory File to:", 8, 147, 125, 20)
Global $Input1 = GUICtrlCreateInput(@ScriptDir, 25, 167, 240, 20)
$Browse_1 = GUICtrlCreateButton("...", 270, 167, 30, 20)
GUICtrlCreateLabel("Scan directory for file(s):", 8, 197, 125, 20)
Global $Input2 = GUICtrlCreateInput(@ScriptDir, 25, 217, 240, 20)
$Browse_2 = GUICtrlCreateButton("...", 270, 217, 30, 20)
GUICtrlCreateLabel("Progress:", 90, 240, 65, 20)
GUICtrlSetFont (-1, 10, 600)
Global $Label_1 = GUICtrlCreateLabel("Waiting", 165, 240, 95, 20)
GUICtrlSetFont (-1, 10, 600)
GUISetState (@SW_SHOW)

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            GUICtrlSetData($Label_1, "Scanning...")
            GUICtrlSetFont (-1, 10, 600)
            GUICtrlSetColor(-1, 16711680)
            $ext = StringSplit(GUICtrlRead($Input3), ",")
            $Amount = StringTrimRight(_ArrayToString($ext), StringLen(_ArrayToString($ext) - 2))
            $Text = GUICtrlRead($Input1) & "\Inventory.txt"
            If FileExists($Text) Then FileDelete($Text)
            For $x = 1 To $Amount
;~              MsgBox(0, "Check", $ext[$x])
                If BitAND(GUICtrlRead($Checkbox_1), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($Checkbox_2), $GUI_CHECKED) = $GUI_CHECKED Then
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 2, True)
                        If @Error = 4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                ElseIf BitAND(GUICtrlRead($Checkbox_1), $GUI_CHECKED) = $GUI_CHECKED And BitAND(GUICtrlRead($Checkbox_2), $GUI_UNCHECKED) = $GUI_UNCHECKED Then
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 0, True)
                        If @Error=4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                ElseIf BitAND(GUICtrlRead($Checkbox_1), $GUI_UNCHECKED) = $GUI_UNCHECKED And BitAND(GUICtrlRead($Checkbox_2), $GUI_CHECKED) = $GUI_CHECKED Then
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 2, False)
                        If @Error=4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                Else
                    $Inventory = _FileListToArray_Recursive(GUICtrlRead($Input2), $ext[$x], 1, 0, False)
                        If @Error=4 Then MsgBox (48,"Error","No "&$ext&" Files Found.", 5)
                    EndIf
                $aText = FileOpen($Text, 1)
                _FileWriteFromArray($aText, $Inventory, 1)
                FileClose($aText)
            Next
            GUICtrlSetData($Label_1, "Done")
            GUICtrlSetFont (-1, 10, 600)
            GUICtrlSetColor(-1, 32768)
            Sleep(2000)
            $CountLines = (_FileCountLines($Text))
            If $CountLines > 0 Then
                MsgBox(1, "Info", "Number of file(s) in folder(s): " & $Countlines & @CRLF & "List saved at: " & $Text, 8)
                Run("notepad.exe " & $Text)
            EndIf
        Case $msg = $Browse_1
            $temppath = FileSelectFolder("Save File Where", "", 1, @ScriptDir)
            GUICtrlSetData($Input1, $temppath)
        Case $msg = $Browse_2
            $temppath = FileSelectFolder("Choose a folder to search.", "", 1, @ScriptDir)
            GUICtrlSetData($Input2, $temppath)
    EndSelect
Wend

Func _FileListToArray_Recursive($sPath, $sFilter = "*", $iRetItemType = 0, $iRetPathType = 0, $bRecursive = False)
    Local $sRet = "", $sRetPath = ""
    $sPath = StringRegExpReplace($sPath, "[\\/]+\z", "")
    If Not FileExists($sPath) Then Return SetError(1, 1, "")
    If StringRegExp($sFilter, "[\\/ :> <\|]|(?s)\A\s*\z") Then Return SetError(2, 2, "")
    $sPath &= "\|"
    $sOrigPathLen = StringLen($sPath) - 1
    While $sPath
        $sCurrPathLen = StringInStr($sPath, "|") - 1
        $sCurrPath = StringLeft($sPath, $sCurrPathLen)
        $Search = FileFindFirstFile($sCurrPath & $sFilter)
        If @error Then
            $sPath = StringTrimLeft($sPath, $sCurrPathLen + 1)
            ContinueLoop
        EndIf
        Switch $iRetPathType
            Case 1 ; relative path
                $sRetPath = StringTrimLeft($sCurrPath, $sOrigPathLen)
            Case 2 ; full path
                $sRetPath = $sCurrPath
        EndSwitch
        While 1
            $File = FileFindNextFile($Search)
            If @error Then ExitLoop
            If ($iRetItemType + @extended = 2) Then ContinueLoop
            $sRet &= $sRetPath & $File & "|"
        WEnd
        FileClose($Search)
        If $bRecursive Then
            $hSearch = FileFindFirstFile($sCurrPath & "*")
            While 1
                $File = FileFindNextFile($hSearch)
                If @error Then ExitLoop
                If @extended Then $sPath &= $sCurrPath & $File & "\|"
            WEnd
            FileClose($hSearch)
        EndIf
        $sPath = StringTrimLeft($sPath, $sCurrPathLen + 1)
    WEnd
    If Not $sRet Then Return SetError(4, 4, "")
    Return StringSplit(StringTrimRight($sRet, 1), "|")
EndFunc   ;==> Melba23's _FileListToArray_Recursive
Si lo deseas puedes usar también la función: FileGetAttrib("c:\") que te devuelve "D" si es un directorio, por si hay ficheros vacios no piense que es una carpeta!!

Salu22:)
Responder