Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 3
Ir a la página 1, 2, 3  Siguiente
 
Eliminación Redundante Rmdir_r De Un Directorio
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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.

Public Sub Rmdir_r(rutahost As String)
    
    Dim rutas As String[] = New String[]
    Dim archivoMas As String
    Dim dirreccion As String
    Dim bvalor1 As Boolean
    Dim bvalor2 As Boolean
    Dim File As String
    
    rutas.Add(rutahost)  
    
    
    If Exist(rutahost) Then
        
        While Exist(rutahost) = True
            
            If Dir(rutas[rutas.max]).Count >= 0 Then    
                archivoMas = rutas[rutas.Max]
                For Each File In Dir(archivoMas).Sort()
                    rutas.Add(archivoMas & "/" & file)  
                    
                Next
                
                archivoMas = rutas[rutas.Max]
                bvalor1 = Stat(archivoMas).Type = gb.Directory
                If bvalor1 = True Then
                    If Dir(archivoMas).Count = 0 Then
                        Rmdir archivoMas
                        rutas.Remove(rutas.Max)  
                    Endif  
                Else
                    bvalor2 = Stat(archivoMas).Type = gb.File
                    If bvalor2 = True Then
                        Kill archivoMas
                        rutas.Remove(rutas.Max)
                    Endif
                Endif  
            Endif
            
        Wend
        
    Else
        Message("Carpeta Inexistente")
    Endif    
    
End


---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.
 



 
honovan - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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...
 



 
honovan - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Eliminación Redundante Rmdir_r De Un Directorio 
 
El código de arriba parece ser un poco complicado. Prueba esto: -
Public Sub Rmdir_r(rutahost As String)
Dim sFile As String

If Not Exist(rutahost) Then Return

For Each sFile In Dir(rutahost)
  Kill rutahost &/ sFile
Next

Rmdir rutahost

End
 

 



 
cogier - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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???...
 



 
honovan - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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...
 



 
honovan - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
honovan - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Abrir Directorio Y Que No Sea Con Nautilus? Agamenon General 9 Sabado, 07 Abril 2012, 16:06 Ver último mensaje
Agamenon
No hay nuevos mensajes Directorio Padre De Otro Directorio tincho Aplicaciones/Fragmentos de Código 7 Miercoles, 05 Abril 2017, 17:17 Ver último mensaje
shordi
No hay nuevos mensajes Directorio Del Proyecto Shell General 5 Lunes, 05 Junio 2017, 10:02 Ver último mensaje
tincho
No hay nuevos mensajes Seleccionar Más De Un Directorio Shell General 7 Lunes, 25 Septiembre 2017, 08:10 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 3
Ir a la página 1, 2, 3  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron