Ya he hablado en alguna otra ocasión de alguna de las capacidades de FolderItem; esto es, la clase que nos permite crear y acceder a archivos. Pues bien, en esta ocasión veremos una de las que —en mi opinión— constituye una pequeña joya que quizá pase más desapercibida de lo que debería en el framework clásico. Se trata de VirtualVolume, o la capacidad de que creemos un archivo que actuará como si se tratase de un volumen de almacenamiento sobre el cual podemos crear, leer, copiar, etc., archivos de texto o binarios e incluso crear en su interior una jerarquía de directorios mediante el uso de FolderItem.CreateAsFolder.
Para entendernos, y aunque su funcionamiento no es extrictamente igual, podría decirse que el comportamiento de los Volúmenes Virtuales es como el empleado por el de las Máquinas Virtuales para preservar bajo un único archivo tanto el sistema operativo que ejecutan como los archivos generados por el usuario en estos. ¿Lo mejor de todo? Tanto los archivos como la estructura interna de los volúmenes virtuales son multiplataforma, lo que por un lado significa que no tendremos problema para acceder a estos desde cualquiera de las plataformas de despliegue soportadas por Xojo. La desventaja es que no podremos utilizar los accesos mediante rutas propios de cada uno de los sistemas operativos, sino que deberemos acceder a un archivo determinado en la jerarquía de directorios que hubiésemos creado en el VolumenVirtual haciendo uso del método Child proporcionado por la clase FolderItem.
¿Qué tipo operaciones podemos ejecutar sobre los archivos creados en un Volumen Virtual? En principio podemos utilizar sin mayor problema tanto los métodos para la creación y lectura de archivos de texto como de archivos en formato binario. Eso sí, no se conservan los recursos y en el caso de los archivos que sean bundles (muy típicos en macOS) deberemos de tener en cuenta que para Xojo se presentan como una jerarquía de directorios y archivos dentro de dichos directorios; de modo que si intentamos aplicar por ejemplo el método CopyFileTo sobre un archivo de tipo Bundle para copiarlo a nuestro volumen virtual… simplemente no funcionará.
Por otra parte, los nombres de los archivos creados sobre un volumen virtual no pueden exceder la longitud de 223 caracteres.
Creando Volúmenes Virtuales
¿Cómo podemos crear uno de estos volúmenes virtuales? Pues bien fácil. Como de costumbre, lo primero que necesitaremos será una instancia de FolderItem que apunte al archivo que actuará como volúmen virtual; es decir, que contendrá todos los archivos que creemos en su interior, junto con las “carpetas” que deseemos incorporar como parte de la jerarquía de directorios. Por ejemplo, para crear un volúmen virtual con el nombre MiVolumen
en el Escritorio del equipo podríamos utilizar las siguientes líneas de código:
Dim f as FolderItem = SpecialFolder.DesktopFolder.Child("MiVoluem") If f <> nil then Dim vv as VirtualVolume = f.CreateVirtualVolume End If
Ahora bien, ten en cuenta que esta operación volverá a crear el archivo en el caso de que este ya existiese perdiendo por tanto sus contenidos. Esto nos lleva precisamente al modo en el que podemos abrir o acceder a un Volumen Virtual una vez que ya está creado con el método OpenAsVirtualVolume
, de modo que podamos acceder a los archivos almacenados sobre el mismo como también continuar creando nuevos archivos y/o carpetas, modifcándolos, borrándolos, etc. Para ello, podríamos utilizar un fragmento de código como el siguiente:
Dim f As FolderItem = SpecialFolder.Desktop.Child("VirtualVolume") If f <> Nil And f.Exists = False Then vv = f.CreateVirtualVolume Elseif f <> Nil And f.Exists = True Then vv = f.OpenAsVirtualVolume End If
Acceder al directorio Raíz
Sea cual sea la operación que deseemos realizar sobre el volúmen virtual, una vez que tengamos una instancia válida accederemos al directorio Raíz del volúmen virtual haciendo uso del método Root
, y que nos devolverá un FolderItem. Una vez obtenida esta referencia, ya podremos operar a partir de ella para trabajar con archivos.
Por ejemplo, el siguiente fragmento de código se encargará de copiar el archivo que seleccionemos sobre el directorio raíz de nuestro Volumen Virtual. Ten en cuenta que, al igual que ocurre con otras muchas operaciones en Xojo, el proceso de copia bloqueará el hilo principal de ejecución, de modo que probablemente te interese implementar esta característica sobre su propio hilo:
// Entendemos que vv apunta a una instancia válida de VirtualVolume Dim f As FolderItem = GetOpenFolderItem("") If f <> Nil Then f.CopyFileTo(vv.Root) End If
Por otra parte, ¡no hay nada que nos impida crear un Volumen Virtual dentro de otro Volumen Virtual! Eso sí, tampoco tenemos un mecanismo que nos permita saber si un archivo determinado es un Volumen Virtual, de modo que nuestro código ha de saber de antemano o mediante cualquier mecanismo previsto por nosotros cuáles de los archivos de su interior podrán ser accedidos como Volúmenes Virtuales y cuales como archivos normales. Probablemente, dado que nuestro programa será en la mayoría de los casos el encargado de generar esta jerarquía de volúmenes virtuales anidados no tengamos mayor problema para identificarlos (quizá utilizando un tipo específico de nomenclatura).
Lo que sí que nos proporciona la clase FolderItem es la propiedad VirtualVolume
, y que al consultarla nos entregará la referencia al Volumen Virtual sobre el que se encuentra almacenado el archivo apuntado por la instancia FolderItem, si es el caso, o bien el valor Nil
en el caso de que el archivo no esté almacenado en un Volumen Virtual.
Sin perder los datos
Por último, en la clase VirtualVolume también encontramos el método Flush
y que es el encargado de forzar el vaciado de los buffer para que los datos queden reflejados en el archivo físico (es decir, en disco), de modo que estos no se pierdan. No obstante, y tal y como ocurre a la hora de trabajar con los archivos convencionales, ten en cuenta que esta operación se realiza automáticamente cada vez que se cierra el archivo del volumen virtual, como puede ocurrir por ejemplo cuando se sale de la aplicación.
Conclusiones
Particularmente sigo encontrando muy útil el uso de los Volumenes Virtuales para manener una jeraquía de directorios y archivos de modo que, ante el usuario de la aplicación, se muestre como si se tratase de un único archivo: mucho más fácil de trabajar, mover, transportar… y, sobretodo, ¡multiplataforma sin tener que lidiar con diferentes tipos de rutas o formatos de ruta! En definitiva, y si bien esta capacidad no está disponible bajo el framework moderno, quizá encuentres interesante el uso de los volúmenes virtuales en alguno de tus proyectos Desktop, Consola o Web; por razones obvias, no así en el caso de los proyectos iOS.