Mmmmm.....esto se puede hacer de varias formas, como siempre
.
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
:
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
). También tenemos el msdn:
http://msdn.microsoft.com/en-us/library ... s.85).aspx
Espero que os hayan gustado
.
Saludos.