¿Alguna vez has necesitado que tu código borre los contenidos (archivos y otras carpetas) en una carpeta determinada? Si es así, te popongo una técnica que puedes utilizar para hacerlo de forma recursiva. Esto es, la función se llamará a sí misma cada vez que se detecte una nueva carpeta/directorio en el interior de la carpeta inicial seleccionada. ¡Eso sí, atento! En esta implementación, si se encuentra con un alias que apunte a un directorio del disco duro… también se borrarán los archivos y la carpeta originales, no sólo el alias. Sin embargo, es fácil modificarlo para que esto no ocurra, si lo único que quieres es borrar el alias propiamente dicho, claro. Esto es algo que te tocará modificar.
Como probablemente ya sepas, cuando en Xojo trabajamos con archivos o carpetas en realidad estamos utilizando la clase FolderItem de modo que podamos acceder tanto a todas sus propiedades como a los métodos que actúen sobre cada instancia del objeto; ya sea para cambiar el nombre, consultar la fecha de creación, crear una copia, mover el archivo o directorio a una nueva ubicación… y también para borrarlo, claro está.
Por otra parte, la recursividad es una técnica que no siempre es apropiada puesto que cada vez que una función se llama a sí misma se añade nueva información a la Pila de ejecución (frame o trama) sin haber liberado previamente la trama existente anterior, y esto puede derivar en errores de Desbordamiento de Pila en el caso, por ejemplo, de que la misma función requiera añadir una cantidad elevada de nuevas tramas en la pila. Por ejemplo, en nuestro caso esto sería lo que ocurriría si la carpeta originen seleccionada tuviese una profundidad elevada en cuanto a la cantidad de subdirectorios contenidos dentro de otros. No obstante, el lenguaje Xojo también nos proporciona herramientas para lidiar con estas situaciones, claro está.
Con esto dicho, ¿cuál es el mejor modo para implementar esta función o método de modo que sea accesible a todas las instancias de FolderItem? Podrías crear una subclase, pero esto significaría que el método sólo podría llamarse sólo en aquellas instancias derivadas de la subclase, y no en las instancias creadas a partir de la clase FolderItem padre, lo cual no es lo más interesante. La respuesta, en este caso, la encontramos en otra técnica OOP brindada por el lenguaje: las Extensiones de Clase. En resumen, esta técnica nos permite añadir nueva funcionalidad a una clase ya existente sin necesidad de tener que crear una nueva subclase a partir de la misma.
El modo de añadir las extensiones de clase en Xojo es a través de los Módulos, puesto que es necesario que el ámbito de dichos métodos sea global para todos los objetos de la clase que deseemos extender o ampiar.
El compilador de Xojo sabrá que queremos ampliar una clase porque hemos de utilizar la palabra clave Extends
en la definición del método propiamente dicho, además de que el primer argumento del método se corresponderá con el tipo de dato correspondiente a la clase que deseamos ampliar.
Por tanto, la definición de nuestra función recursiva será:
DeleteAllFilesInside(extends f as FolderItem)
Manteniendo en el Panel Inspector el campo Scope
con el valor Global
; es decir, que el método sea visible para toda la aplicación en la que se encuentre definido el módulo.
Una vez que tenemos la signatura del método, ya podemos ceñirnos al código encargado de realizar la función de borrado. Entre otras muchas implementaciones, puedes utilizar el siguiente:
Static originFolder As String = f.NativePath If f.Directory Then For n As Integer = f.Count DownTo 1 If f.Item(n) <> Nil Then If f.item(n).Directory And f.Count <> 0 Then Dim f1 As FolderItem = f.item(n) f1.deleteAllFilesInside End If If f.item(n) <> Nil And f.item(n).NativePath <> originfolder Then f.item(n).Delete End If Next End If f <> Nil And f.NativePath <> originFolder Then f.Delete
¡Recuerda que en esta imoplementación se borrarán los archivos originales apuntados por un Alias! Eso sí, es muy fácil modificarlo para que esto no sea así, del midmo modo que también te resultará sencillo cambiar el código para que también se borre la carpeta seleccionada originalmente como punto final del proceso.