Eliminar contenido de carpeta.
Eliminar contenido de carpeta.
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.
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.
- BasicOs
- Site Admin
- Mensajes: 2091
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Eliminar contenido de carpeta.
No puedes borrar completamente la carpeta raiz, y volver a crearla enseguida de nuevo con un DirCreate()?? que es lo mismo.
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:)
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:)
Re: Eliminar contenido de carpeta.
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!
Gracias colega!
- BasicOs
- Site Admin
- Mensajes: 2091
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Eliminar contenido de carpeta.
Puedes restablecer los permisos - atributos con FileSetAttrib(), o tambien con el sistema operativo, con Attrib del command, arrancandolo desde un run()
Salu22:)
Salu22:)
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Eliminar contenido de carpeta.
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.
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)
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Eliminar contenido de carpeta.
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.
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)
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Eliminar contenido de carpeta.
Ya estoy aquí otra vez
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ú:
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?
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
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)
- BasicOs
- Site Admin
- Mensajes: 2091
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Eliminar contenido de carpeta.
@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:
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)
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:)
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
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
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:)
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Eliminar contenido de carpeta.
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:
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 :
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:
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):
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.
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
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
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
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
Espero que os hayan gustado .
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 ;).
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Eliminar contenido de carpeta.
Aaaaaaaaaaaaahhhhhhhhhhhh, se me olvidaba responder a mi amigo Ximorro .
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 .
Saludos.
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: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?
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).Return Value
Success: Returns >= 0 the sizes
Failure: Returns -1 and sets @error to 1 if the path doesn't exist.
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 .
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 ;).
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Eliminar contenido de carpeta.
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
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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Re: Eliminar contenido de carpeta.
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:
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.
Finalmente he utilizado este script:
Ximorro escribió:Ya estoy aquí otra vez
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ú: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.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
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.
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Eliminar contenido de carpeta.
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 pero también es importante que entiendas los códigos (más o menos) y aprendas de ello, para cuando necesites algo parecido.
$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 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)