Autor |
Mensaje |
honovan
Usuario
Registrado: Febrero 2010
Mensajes: 35
Edad: 47
|
Eliminación Redundante Rmdir_r De Un Directorio
saludos a todos...
tratando de eliminar un directorio me puse a la tarea simple y sencilla.., algo muy, muy trivial y me dispongo a utilizar rmdir... cuando ¡Oh sorpresa !.., X(error , directorio no está vacío)... y comienza el cristo a padecer, lo que era algo sencillo y trivial se forma una tormenta de agua... fueron 3 dias para hacer que funcionara algo tan simple me tardé tres (3) días en hacerla, imposible pero cierto.., aquí les dejo el código, si lo pudiesen mejorar y compartirlo les agradeceria mucho.
---al final me pregunto por qué gambas copia al pie juntillas funciones de linux shell rmdir pero no copia el -r ??? seria muy útil tener esas opciones, hablo de las demás funciones que están capadas, a uds muchas gracias, hasta la próxima.
|
#1 Viernes, 07 Diciembre 2018, 22:08 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
Buen trabajo, pero creo que te faltan algunos detalles:
-No veo ningún control de fallos, por ejemplo: ¿Qué ocurre si en alguno de los subdirectorios hay un fichero o directorio sobre el que no tienes derecho de escritura?
-No veo ningún "control de barbaridades" ¿Qué pasa si alguien, por ejemplo, ejecuta la función con rmdir_r(user.home) o teniendo derechos, claro, ejecuta rmdir_r(user.home &/ "../") o, la estrella de los desastres rmdir_r(user.home &/ "../../")
Saludos
=================== No podemos regresar
|
#2 Sabado, 08 Diciembre 2018, 10:19 |
|
|
honovan
Usuario
Registrado: Febrero 2010
Mensajes: 35
Edad: 47
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
Shordi saludos...
--- si intentando hacer algo parecido con tu ejemplo crear archivos redundantes pero ahora eliminandolos de un directorio pues es lo que necesito, funciona ...
---lo de crear las controles de error ufff , me gustaria me dieran una mano ... por eso me les adelante ...me gustaría que la mejoraran y lo compartieran... si lo de los controles de error quedaría mas profesional.., asi esta muy primiparo, tengo calambres con ese tema no lo manejo muy bien y seria tema de practicar ya veremos...
---sobre la estrella de la corona me falto decir...peligro utilice con cuidado , jejejeje.
saludos...
|
#3 Domingo, 09 Diciembre 2018, 03:37 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
Honovan:
Para el control de errores puedes ver este post, pero seguro que hay mas.
https://foro.gambas-es.org/viewtopic.php?f=1&t=4257
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#4 Domingo, 09 Diciembre 2018, 08:55 |
|
|
cogier
Charlie Ogier
Aprendiz
Registrado: Septiembre 2018
Mensajes: 99
Edad: 69 Ubicación: Guernsey, Channel Islands
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
El código de arriba parece ser un poco complicado. Prueba esto: -
|
#5 Domingo, 09 Diciembre 2018, 13:54 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
Este tipo de tareas me gusta hacerlas usando la recursividad en las funciones. Siempre es arriesgado, pero queda muuuy elegante.
Para éste problema yo haría algo así:
Public Sub rmdir_r(path As String)
Dim ar As String[]
Dim nombre As String
ar = Dir(path) 'extraemos los nombre
For Each nombre In arfile
If Stat(path &/ nombre).Type = gb.Directory Then 'si es un directorio...
If Dir(path &/ nombre).count > 0 Then '...y no está vacío
rmdir_r(path &/ nombre) 'usamos la recursividad
Else
Rmdir path &/ nombre 'si está vacío lo borramos
Endif
Else 'si no es un directorio...
Kill path &/ nombrefile '...lo borramos. ¡Ojo! Habría que añadir controles de qué hacer si es un enlace simbólico, qué hacer si falla el borrado por falta de permisos, etc. etc.
Endif
Next
End
Ojo que no lo he probao y no lleva, tampoco, ningún control de desastres, pero la idea queda clara.
Saludos.
=================== No podemos regresar
última edición por shordi el Domingo, 09 Diciembre 2018, 14:26; editado 1 vez
|
#6 Domingo, 09 Diciembre 2018, 14:23 |
|
|
honovan
Usuario
Registrado: Febrero 2010
Mensajes: 35
Edad: 47
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
cogier gracias por tu tiempo al dedicarte a mirar un poco el codigo
si me dure 3 dias devanando el código casi que renunciaba y casi que me dormía probando una y otra y otra vez ese bendito codigo he iba cuadrando todo al paso volvía al pizarron y no la veía sino hasta que gambas corriera y así me di cuenta que lo que escribía en la lógica no salia con lo programado...si la lógica es algo enredada pero ya así escrito se ve mejor, mi lucha fue.., una cosa es tener la idea, la visión de por donde van los tiros y otra que al meter código y correrlo solo lanza errores, uffff.
sobre tu codigo :
If Not Exist(rutahost) Then Return 'si existe el directorio entre y sino retorne ???.., no sera end ???...
For Each sFile In Dir(rutahost) 'X(error: la ruta es un directorio o la ruta es un directorio o directorio no esta vacío)
Kill rutahost &/ sFile
Next
Rmdir rutahost ' el directorio no esta vacío si logra pasar el primero error de arriba
End
---En conclusión seria lo ideal que que fuese así de sencillo pero ahora que pasa si dentro hay otra carpeta que esta llena u ocupada??? y esa otra y otra y otra con directorios y archivos???...
|
#7 Domingo, 09 Diciembre 2018, 20:41 |
|
|
honovan
Usuario
Registrado: Febrero 2010
Mensajes: 35
Edad: 47
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
Shordi saludos...
interesante lo de la recursividad, la tenia entre las ideas pero no la tenia clara el como, pues no tenia la funcion echa y mucho menos concretada, la estructura tuya la tuve en el principio pero sin la recursividad que es genial la cuestión es que, si la carpeta esta vacía pasa derecho y el directorio del paht queda sin borrar al final, ya veremos como la arreglamos...
|
#8 Domingo, 09 Diciembre 2018, 21:31 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
La recursividad viene muy bien en caso de destrucción masiva...
Destrucción recursiva.
La recursividad es muy practica aunque no siempre es fácil entenderla.
Primero no recursivo y luego...lo que vaya saliendo.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#9 Lunes, 10 Diciembre 2018, 13:55 |
|
|
honovan
Usuario
Registrado: Febrero 2010
Mensajes: 35
Edad: 47
|
Re: Eliminación Redundante Rmdir_r De Un Directorio
una pequeña mejora con respecto a código un poco mas corto....
Public Sub Rmdir_r(rutahost As String)
Dim rutas As String[] = New String[]
Dim File As String
rutas.Add(rutahost)
If Exist(rutahost) Then 'existe la ruta???
While Exist(rutahost) = True 'haga mientras la ruta existe
For Each File In Dir(rutas[rutas.Max]).Sort() 'pase el nombre del archivo
rutas.Add(rutas[rutas.Max] & "/" & file) 'agreguela al final de rutas
Next
If Stat(rutas[rutas.Max]).Type = gb.Directory Then 'evalue si el archivo es o no un directorio es un directorio
If Dir(rutas[rutas.Max]).Count = 0 Then 'directorio si y solo si, esta vacio y no que esta ocupado
Rmdir rutas[rutas.Max]
rutas.Remove(rutas.Max)
Endif
Else
Kill rutas[rutas.Max] 'borre archivo
rutas.Remove(rutas.Max)
Endif
Wend
Else
Print "Inexistente"
Endif
End
---Print "Inexistente" y "Eliminada" podría ser variables que devolviera el sub seguiremos mejorando
|
#10 Martes, 11 Diciembre 2018, 18:44 |
|
|
|