Eliminar contenido de carpeta.

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Pableitor
Mensajes: 3
Registrado: 06 Abr 2011, 16:48

Eliminar contenido de carpeta.

Mensaje por Pableitor »

Buenas a todos antes de nada.

Mi pregunta es la siguiente:

Soy MUY nuevo en AutoiT y me gustaría saber si puedo eliminar el contenido de una carpeta (archivos y subdirectorios) sin tener que borrar la carpeta raíz. He mirado en la ayuda del programa, pero solo encuentro el comando para borrar únicamente los archivos pero no los subdirectorios de dicha carpeta.

Agradezco cuaquier ayuda.


Un saludo y gracias de antemano.
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Eliminar contenido de carpeta.

Mensaje por BasicOs »

No puedes borrar completamente la carpeta raiz, y volver a crearla enseguida de nuevo con un DirCreate()?? que es lo mismo. :smt043 :smt043

Puedes controlar cualquier carpeta y sus subcarpetas y los archivos con FileFindNext() y las funciones que te van recorriendo carpetas para "manejar" más detalladamente.
Salu22:)
Pableitor
Mensajes: 3
Registrado: 06 Abr 2011, 16:48

Re: Eliminar contenido de carpeta.

Mensaje por Pableitor »

Gracias por la rapidez, he intentado borrarla y crearla de nuevo, pero me modifica los permisos por lo que no me vale. Voy a intentar buscar algo por lo que me has recomendado y te comento.

Gracias colega!
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Eliminar contenido de carpeta.

Mensaje por BasicOs »

Puedes restablecer los permisos - atributos con FileSetAttrib(), o tambien con el sistema operativo, con Attrib del command, arrancandolo desde un run()
Salu22:)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Eliminar contenido de carpeta.

Mensaje por Ximorro »

Ahora me entero de que el comando del DOS "DEL /s" no borra subdirectorios, sólo los archivos dentro de subdirectorios... juraría que yo eso lo he usado, ¿habrá cambiado en los nuevos Windows? Lástima porque se podría haber usado eso.
También había para esto una utilidad llamada Deltree... pero en mi Windows XP no está, tampoco sabía que la habían quitado...

Así que, o haces lo que dice Basicos y recreas la carpeta con sus permisos (lo cual puede ser imposible si por ejemplo tienes permisos para borrar el contenido, pero no la carpeta en sí, como podría ocurrir en una carpeta en red) o te haces un programa que vaya archivo a archivo y los borre todos, incluyendo las subcarpetas, cuando éstas estén vacías.

Por el foro hay varios hilos sobre recorrer archivos en subcarpetas recursivamente, será cosa de coger uno de ellos y modificarlos para que borren los archivos que vayan encontrando, menos la carpeta primera donde se inicia el proceso.
"¿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: Eliminar contenido de carpeta.

Mensaje por Ximorro »

He encontrado una cosa, si no te importa que lo borrado vaya a la papelera de reciclaje sí se puede hacer con un sólo comando.
Por ejemplo lo siguiente manda a la papelera todo el contenido de la carpeta "carpe", ya sean directorios (vacíos o con archivos) y archivos.
FileRecycle ("c:\temp\carpe\*")

Después siempre puedes borrar la papelera con FileRecycleEmpty("C:\"), al poner el "c:\" (o la letra del disco donde has borrado) sólo limpias la papelera para esa unidad (si no pones nada borra de todas las unidades). De todas maneras al borrar la papelera, aunque sea de sólo una unidad, puedes borrar otros archivos que quieres tener ahí :-(


En el otro sistema más manual, en realidad no hay que hacer un recorrido recursivo, sólo hay que leer el contenido de la carpeta inical, y para cada carpeta hacer un DirRemove, y para cada archivo hacer un FileDelete.
DirRemove ya se encarga de borrar la carpeta con todo lo que tiene dentro, con lo que no hay que entrar recursivamente por todo el árbol de directorios.
"¿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: Eliminar contenido de carpeta.

Mensaje por Ximorro »

Ya estoy aquí otra vez :smt003

Me ha picado la cosa y he hecho esto siguiendo la idea anterior de mirar el contenido de la carpeta pero sin entrar en subcarpetas. Le pongo la carpeta inicial por código, tú la sacarás de un GUI, la línea de comandos o como lo quieras usar. Si te va a venir de un usuario tendrás que controlar errores, como que si pone "\" final no volverlo a añadir tú:

Código: Seleccionar todo

;Carpeta inicial de la cual queremos borrar el contenido pero no la carpeta
$carpeta = "c:\temp\carpe"

$search = FileFindFirstFile($carpeta & "\*") ; Buscamos todo el contenido

If $search = -1 Then
	MsgBox(0, "Advertencia", "La carpeta ya está vacía")
	Exit
EndIf

While 1
	$fich = FileFindNextFile($search)
	If @error Then ExitLoop ;Hemos llegado al final

	$pathCompleto = $carpeta &"\" & $fich
	$atribs = FileGetAttrib($pathCompleto)
	If StringInStr($atribs, "D") Then ;es directorio
		DirRemove($pathCompleto, 1)
	Else ;archivo normal
		FileDelete($pathCompleto)
	EndIf
WEnd

FileClose($search) ; Para acabar cerramos el manejador de búsqueda
Como ves como errores sólo compruebo si la carpeta ya está vacía, no es exactamente un error, no se hace nada y ya está, pero lo informo.
Puedes ampliarlo comprobando otros errores, como archivos en uso que no se pueden borrar.

No sé otra manera más fácil de mirar si un archivo es una carpeta, he tenido que mirarlo en los atributos ¿alguien conoce alguna manera directa de hacerlo?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Eliminar contenido de carpeta.

Mensaje por BasicOs »

@Ximorro Creo que es la correcta la que muestras, ver los atributos de un fichero/dir, simpre puedes crear la func isDir() con lo que escribes.
Otro ejemplo de uso de dir con el borrado de directorios vacios:

Código: Seleccionar todo

#Include <Array.au3>

$ddnumber=0

$FileList=_FileListToArray(@ScriptDir)
If @Error=1 Then
    MsgBox (0,"","No Files\Folders Found.")
    Exit
EndIf

for $i = 1 to $FileList[0]
    if StringInStr(FileGetAttrib($FileList[$i]),"D") Then
        if DirGetSize($FileList[$i]) = 0 Then
            if DirRemove($FileList[$i]) then 
                ConsoleWrite("Dir removed: " & $FileList[$i] & @crlf)
                $ddnumber +=1
            Else
                ConsoleWrite("Could not remove (empty?) dir: " & $FileList[$i] & @crlf)
            endif
        Else
            ConsoleWrite("Dir not removed (contains files): " & $FileList[$i] & @crlf)
        endif
    EndIf
Next
Otra Func más además de las que hay en el foro de "recorrido recursivo de directorios y ficheros" parecido al FilelistToArray pero te sirve en bandeja en una Matríz/Array los elementos que cumplen *.* o lo que desees:
Func RecursiveFileSearch($RFSstartDir, $RFSFilepattern = ".", $RFSFolderpattern = ".", $RFSFlag = 0, $RFSrecurse = True, $RFSdepth = 0)

Código: Seleccionar todo

#include <array.au3>

$ddnumber = 0

$var = FileSelectFolder("Delete Empty directories from:", "", 7)
If @error Then Exit

$FileList = RecursiveFileSearch($var, "", "", 2, True)
If @error = 1 Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
EndIf

;_ArrayDisplay($FileList)

For $i = 1 To $FileList[0]
    If StringInStr(FileGetAttrib($FileList[$i]), "D") Then; If parent (empty) dir has already been deleted, FileGetAttrib returns Blank and further analysis is skiped.
        If DirGetSize($FileList[$i]) = 0 Then
            If DirRemove($FileList[$i]) Then
                ConsoleWrite("Dir removed: " & $FileList[$i] & @CRLF)
                $ddnumber += 1
            Else
                ConsoleWrite("Could not remove (empty?) dir: " & $FileList[$i] & @CRLF)
            EndIf
        Else
            ConsoleWrite("Dir not removed (contains files): " & $FileList[$i] & @CRLF)
        EndIf
    EndIf
Next

If $ddnumber = 0 Then
    MsgBox(0, "No empty directories", "No empty directories found")
Else
    MsgBox(0, "Results", $ddnumber & " empty directories removed")
EndIf




#cs ----------------------------------------------------------------------------
    #1 - Array based from http://www.autoitscript.com/forum/index....p?showtopic=58558&view=findpos
    
    AutoIt Version: 3.2.10.0
    Author: WeaponX
    Updated: 2/21/08
    Script Function: Recursive file search
  
    Parameters:
    
    RFSstartdir: Path to starting folder
    
    RFSFilepattern: RegEx pattern to match
    "\.(mp3)" - Find all mp3 files - case sensitive (by default)
    "(?i)\.(mp3)" - Find all mp3 files - case insensitive
    "(?-i)\.(mp3|txt)" - Find all mp3 and txt files - case sensitive
    
    RFSFolderpattern:
    "(Music|Movies)" - Only match folders named Music or Movies - case sensitive (by default)
    "(?i)(Music|Movies)" - Only match folders named Music or Movies - case insensitive
    "(?!(Music|Movies)\b)\b.+" - Match folders NOT named Music or Movies - case sensitive (by default)
    
    RFSFlag: Specifies what is returned in the array
    0 - Files and folders
    1 - Files only
    2 - Folders only
    
    RFSrecurse: TRUE = Recursive, FALSE = Non-recursive
    
    RFSdepth: Internal use only
    
#ce ----------------------------------------------------------------------------
Func RecursiveFileSearch($RFSstartDir, $RFSFilepattern = ".", $RFSFolderpattern = ".", $RFSFlag = 0, $RFSrecurse = True, $RFSdepth = 0)

;Ensure starting folder has a trailing slash
    If StringRight($RFSstartDir, 1) <> "\" Then $RFSstartDir &= "\"

    If $RFSdepth = 0 Then
    ;Get count of all files in subfolders for initial array definition
        $RFSfilecount = DirGetSize($RFSstartDir, 1)

    ;File count + folder count (will be resized when the function returns)
        Global $RFSarray[$RFSfilecount[1] + $RFSfilecount[2] + 1]
    EndIf

    $RFSsearch = FileFindFirstFile($RFSstartDir & "*.*")
    If @error Then Return

;Search through all files and folders in directory
    While 1
        $RFSnext = FileFindNextFile($RFSsearch)
        If @error Then ExitLoop

    ;If folder and recurse flag is set and regex matches
        If StringInStr(FileGetAttrib($RFSstartDir & $RFSnext), "D") Then

            If $RFSrecurse And StringRegExp($RFSnext, $RFSFolderpattern, 0) Then
                RecursiveFileSearch($RFSstartDir & $RFSnext, $RFSFilepattern, $RFSFolderpattern, $RFSFlag, $RFSrecurse, $RFSdepth + 1)
                If $RFSFlag <> 1 Then
                ;Append folder name to array
                    $RFSarray[$RFSarray[0] + 1] = $RFSstartDir & $RFSnext
                    $RFSarray[0] += 1
                EndIf
            EndIf
        ElseIf StringRegExp($RFSnext, $RFSFilepattern, 0) And $RFSFlag <> 2 Then
        ;Append file name to array
            $RFSarray[$RFSarray[0] + 1] = $RFSstartDir & $RFSnext
            $RFSarray[0] += 1
        EndIf
    WEnd
    FileClose($RFSsearch)

    If $RFSdepth = 0 Then
        ReDim $RFSarray[$RFSarray[0] + 1]
        Return $RFSarray
    EndIf
EndFunc  ;==>RecursiveFileSearch
Creditos a Kafu
Hay para elegir, incluso el buscador de ficheros con menus superPro Impresionante buscador de archivos:
http://www.emesn.com/autoitforum/viewto ... f=4&t=2531
Salu22:)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Eliminar contenido de carpeta.

Mensaje por Chefito »

Mmmmm.....esto se puede hacer de varias formas, como siempre :smt002 .

La primera forma es muy facil de aplicar. Sabemos que el objeto filesystemobject es para manejo de archivos, directorios, unidades, etcs. Éste tiene métodos para eliminar archivos y directorios. Pues haciendo un poco de código nos sale lo que queremos:

Código: Seleccionar todo

$fso=ObjCreate("Scripting.FileSystemObject")	;creamos el objeto fso.
$fso.deletefile("c:\DirectorioAborrar\*",True)		;borramos todos los archivos de un directorio
$fso.deletefolder("c:\DirectorioAborrar\*",True)	;borramos todas las carpetas de un directorio
$fso=0		;borro el objeto
Teneis que cambiar el primer parámetro ("c:\DirectorioAborrar\*") por el directorio al que quereis borrar su contenido. Recordar que siempre tiene que acabar en \* para indicarle que quereis borrarle todo el contenido. El 2º parámetro (true) indica que fuerzo a que se borren los archivos y directorios de solo lectura.
Se podría hacer como función......mmmm......bueno, voy a hacerla que no me cuesta nada :smt003 :

Código: Seleccionar todo

;función realizada por chefito. Borra el contenido de un directorio.
Func _BorrarContenidoDir($directorio,$forzar=1)
	DirGetSize($directorio)
	If @error Then
		ConsoleWriteError(">>> No existe el directorio. Ponga un directorio válido." & @CR)
		Return SetError(1,0,0)
	EndIf
	If Not($forzar<>0 Or $forzar<>1) Then
		ConsoleWriteError(">>> Forzar es erroneo. Debe ser o 0 o 1." & @CR)
		Return SetError(2,0,0)
	EndIf
	If StringRight($directorio,1)="\" Then
		$directorio=$directorio & "*"
	Else
		$directorio=$directorio & "\*"
	EndIf
	$fso=ObjCreate("Scripting.FileSystemObject")	;creamos el objeto fso.
	If @error Then
		ConsoleWriteError(">>> Error al intentar crear el objeto. No se ha podido borrar el contenido del directorio" & @CR)
		Return SetError(3,0,0)
	EndIf
	$fso.deletefile($directorio,$forzar)		;borramos todos los archivos de un directorio
	$fso.deletefolder($directorio,$forzar)	;borramos todas las carpetas de un directorio
	$fso=0		;borro el objeto
	Return 1
EndFunc
Lo principal está explicado en el código. Si no veis bien los códigos de errores (@error) que lanza cuando falla o alguna otra cosa me lo decís y la comento algo más.

La segunda forma es como no con apis de windows. Esta es más complicada, ya que tienes que definir la api adecuda. Pero como siempre nuestros amigos de habla inglesa lo han resuelto y me han quitado trabajo. Retocando un poquito el código allí y allá se resuelve el problema.
He utilizado la api SHFileOperation. También he hecho una función:

Código: Seleccionar todo

;función realizada por chefito. Borra el contenido de un directorio.
Func _BorrarContenidoDir($Directorio)
	Local $SHFILEOPSTRUCT, $pFrom, $aDllRet, , $sFrom
	DirGetSize($directorio)
	If @error Then
		ConsoleWriteError(">>> No existe el directorio. Ponga un directorio válido." & @CR)
		Return SetError(1,0,0)
	EndIf
	If StringRight($directorio,1)="\" Then
		$sFrom=$directorio & "*"
	Else
		$sFrom=$directorio & "\*"
	EndIf
	$SHFILEOPSTRUCT = DllStructCreate("hwnd hwnd;uint wFunc;ptr pFrom;ptr pTo;int fFlags;int fAnyOperationsAborted;ptr hNameMappings;ptr lpszProgressTitle")
    DllStructSetData($SHFILEOPSTRUCT, "hwnd", 0)
    DllStructSetData($SHFILEOPSTRUCT, "wFunc", 3)	;$FO_DELETE                 = 0x0003
	$pFrom = DllStructCreate("char[" & StringLen($sFrom)+2 & "]")
    DllStructSetData($pFrom, 1, $sFrom)
    DllStructSetData($pFrom, 1, Chr(0), StringLen($sFrom)+2) ; second null at the end
    DllStructSetData($SHFILEOPSTRUCT, "pFrom", DllStructGetPtr($pFrom))
	DllStructSetData($SHFILEOPSTRUCT, "fFlags", 0x0610)	;$FOF_NOCONFIRMMKDIR + $FOF_NOCONFIRMATION + $FOF_NOERRORUI= 0x0610
    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    If @error Or $aDllRet[0] <> 0 Then
        $aDllRet = DllCall("kernel32.dll", "long", "GetLastError")
        If Not @error Then
			ConsoleWriteError(">>> Número de error: " & $aDllRet[0] & " . No se ha podido borrar el contenido del directorio" & @CR)
			Return SetError(2,0,0)
		EndIf
	EndIf
EndFunc
Como la otra no he comentado los errores que puede devolver. Si os hacen falta los comento.

A continuación os dejo las constantes que puede utilizar esta api, ya que se puede hacer muchas cosas y os pueden interesar (mover, copiar, borrar, renombrar):

Código: Seleccionar todo

Global Const $FO_MOVE                   = 0x0001
Global Const $FO_COPY                   = 0x0002
Global Const $FO_DELETE                 = 0x0003
Global Const $FO_RENAME                 = 0x0004

Global Const $FOF_MULTIDESTFILES        = 0x0001
Global Const $FOF_CONFIRMMOUSE          = 0x0002
Global Const $FOF_SILENT                = 0x0004
Global Const $FOF_RENAMEONCOLLISION     = 0x0008
Global Const $FOF_NOCONFIRMATION        = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE     = 0x0020
Global Const $FOF_ALLOWUNDO             = 0x0040
Global Const $FOF_FILESONLY             = 0x0080
Global Const $FOF_SIMPLEPROGRESS        = 0x0100
Global Const $FOF_NOCONFIRMMKDIR        = 0x0200
Global Const $FOF_NOERRORUI             = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION           = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING       = 0x4000
Global Const $FOF_NORECURSEREPARSE      = 0x8000
Si os interesa, buscar en el foro ingles que hay algunos post donde tratan este tema. Casi todos para copiar, pero adaptarlos a otra función es bastante facil (yo lo he hecho :smt005 ). También tenemos el msdn: http://msdn.microsoft.com/en-us/library ... s.85).aspx

Espero que os hayan gustado :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 ;).
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Eliminar contenido de carpeta.

Mensaje por Chefito »

Aaaaaaaaaaaaahhhhhhhhhhhh, se me olvidaba responder a mi amigo Ximorro :smt005 .
Ximorro escribió:No sé otra manera más fácil de mirar si un archivo es una carpeta, he tenido que mirarlo en los atributos ¿alguien conoce alguna manera directa de hacerlo?
Con la función DirGetSize y su segundo parámetro igual a 2 (para que solo mire en ese directorio y no en los subdirectorios, y así no retrase la finalización de la función). La ayuda nos dice que devuelve:
Return Value

Success: Returns >= 0 the sizes
Failure: Returns -1 and sets @error to 1 if the path doesn't exist.
Si le pasas el nombre de un fichero te devolverá -1 y @error=1, y si es el de un directorio su tamaño (0 o mayor que 0).
Un usuario la utilizó en vez de la función que revisa los atributos. No recuerdo quien. En aquel post le di la enhorabuena por haberlo hecho así, ya que parecía muy efectiva.
Partiendo de esta idea (buscando el acierto/error), puede que haya otras funciones las cuales se puedan utilizar para esto. Estoy pensando por ejemplo en filegetsize, entre otras. Estaría bien hacer pruebas a ver cual funciona más rápido.

Luego, también podemos utilizar el objeto filesystemobject y sus métodos fileexists o folderexists (http://msdn.microsoft.com/en-us/library ... S.85).aspx. En este caso tendrías que tratar con el objeto y no directamente.

Seguro que hay más formas. Solo sería cuestión de buscar.

Y tenía que comentar algo más, pero con tanto rollo se me ha olvidado :smt005 .

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
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Eliminar contenido de carpeta.

Mensaje por Ximorro »

Chefito, como siempre eres el maestro de las APIs, los objetos del sistema y las cosas más esotéricas y "ocultas" de Windows ;-)

Me gusta el que usa FileSystemObject, el código queda muy simple.

El de la API me ha acojonao, tengo que reconocer que no lo he mirado muy en detalle porque me he mareado con tanta estructura y llamada, pero sabiendo que se puede adaptar para muchas cosas lo tendré en cuenta y me lo estudiaré en el futuro si me hace falta.

De las versiones AutoIt me gusta más la mía (poniendo lo de DirGetSize), que no es nada especial, seguramente es lo primero que se le ocurriría a cualquiera. Va bastante al grano y no requiere udfs grandes como array.au3.

El segundo ejemplo que pone BasicOs no lo veo tan útil para esto porque se puede hacer mucho más sencillo, pero para el caso general de tener que entrar por todo el árbol de directorios es interesante aprender de él.
El primero que pones yo lo haría mucho más fácil usando mi esquema quitando cosas (no hay que borrar archivos y las carpetas no borrarlas recursivamente).

Lo de DirGetSize es buena idea, no distingue el error (es un archivo/no existe) pero funciona perfecto. FileGetSize no nos vale aquí, si falla no sabes si es porque es un directorio o porque no existe (bueno, sí valdría dentro del bucle porque sé que le estoy pasando nombres que existen, pero no vale por ejemplo para validar la carpeta incial. DirGetSize es más general.

Bueno Pableitor, espero que no estés muy mareado :smt003
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Pableitor
Mensajes: 3
Registrado: 06 Abr 2011, 16:48

Re: Eliminar contenido de carpeta.

Mensaje por Pableitor »

Bueno colegas, ante todo felicitaros por lo máquina que estáis hechos y agradeceros tantas soluciones y tan rapidas!!!

Finalmente he utilizado este script:
Ximorro escribió:Ya estoy aquí otra vez :smt003

Me ha picado la cosa y he hecho esto siguiendo la idea anterior de mirar el contenido de la carpeta pero sin entrar en subcarpetas. Le pongo la carpeta inicial por código, tú la sacarás de un GUI, la línea de comandos o como lo quieras usar. Si te va a venir de un usuario tendrás que controlar errores, como que si pone "\" final no volverlo a añadir tú:

Código: Seleccionar todo

;Carpeta inicial de la cual queremos borrar el contenido pero no la carpeta
$carpeta = "c:\temp\carpe"

$search = FileFindFirstFile($carpeta & "\*") ; Buscamos todo el contenido

If $search = -1 Then
	MsgBox(0, "Advertencia", "La carpeta ya está vacía")
	Exit
EndIf

While 1
	$fich = FileFindNextFile($search)
	If @error Then ExitLoop ;Hemos llegado al final

	$pathCompleto = $carpeta &"\" & $fich
	$atribs = FileGetAttrib($pathCompleto)
	If StringInStr($atribs, "D") Then ;es directorio
		DirRemove($pathCompleto, 1)
	Else ;archivo normal
		FileDelete($pathCompleto)
	EndIf
WEnd

FileClose($search) ; Para acabar cerramos el manejador de búsqueda
Como ves como errores sólo compruebo si la carpeta ya está vacía, no es exactamente un error, no se hace nada y ya está, pero lo informo.
Puedes ampliarlo comprobando otros errores, como archivos en uso que no se pueden borrar.

No sé otra manera más fácil de mirar si un archivo es una carpeta, he tenido que mirarlo en los atributos ¿alguien conoce alguna manera directa de hacerlo?

Borra totalmente el contenido de la carpeta (incluidos directorios) y deja totalmente intactos los permisos. Ya lo he programado para que se ejecute a diario y listo.

Así que nada mas que decir, que sois unos fieras y que para cualquier duda (en relación a esto) ya se dónde acudir... jejeje.


Un saludo colegas.
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Eliminar contenido de carpeta.

Mensaje por Ximorro »

Tal como me comentaban arriba puedes cambiar:
$atribs = FileGetAttrib($pathCompleto)
If StringInStr($atribs, "D") Then ;es directorio

por
DirGetSize($pathCompleto)
If Not @error Then ;es directorio


Es algo más simple y más rápido.

Nos has puesto a pensar :smt003 pero también es importante que entiendas los códigos (más o menos) y aprendas de ello, para cuando necesites algo parecido.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder