Trabajo con objetos File en AIRAdobe AIR 1.0 y posterior Un objeto File es un puntero a un archivo o directorio del sistema de archivos. La clase File amplía la clase FileReference. La clase FileReference, que está disponible en Adobe® Flash® Player además de en AIR, representa un puntero a un archivo, pero la clase File añade propiedades y métodos que no se exponen en Flash Player (en un archivo SWF que se ejecuta en un navegador) por motivos de seguridad. Clase FileLa clase File se emplea para lo siguiente:
Una vez que un objeto File apunta a una ruta de archivo, se puede utilizar para leer y escribir datos de archivo usando la clase FileStream. Un objeto File puede apuntar a la ruta de un archivo o directorio que aún no existe. Puede utilizarse un objeto File de este tipo al crear un archivo o directorio. Rutas a objetos FileCada objeto File tiene dos propiedades que definen su ruta:
La clase File incluye propiedades estáticas para señalar a directorios estándar tanto en Mac OS, Windows y Linux. Entre estas propiedades se incluyen:
Nota: si una plataforma no define ubicaciones estándar para los directorios de usuario, documentos o escritorio, File.documentsDirectory, File.desktopDirectory y File.userDirectory pueden hacer referencia al mismo directorio.
Estas propiedades tienen valores diferentes en los distintos sistemas operativos. Por ejemplo, Mac y Windows cuentan con rutas nativas distintas en el directorio del escritorio del usuario. Sin embargo, la propiedad File.desktopDirectory señala a una ruta de directorio adecuada en todas las plataformas. Para escribir aplicaciones que funcionen bien en distintas plataformas, utilice estas propiedades como base para hacer referencia a otros directorios y archivos utilizados por la aplicación. Utilice el método resolvePath() para mejorar la ruta. Por ejemplo, el siguiente código señala al archivo preferences.xml en el directorio de almacenamiento de la aplicación: var prefsFile:File = File.applicationStorageDirectory;
prefsFile = prefsFile.resolvePath("preferences.xml");
Aunque la clase File permite señalar a una ruta de archivo específica, esto puede implicar que las aplicaciones no funcionen en distintas plataformas. Por ejemplo, la ruta C:\Documents and Settings\joe\ sólo funciona en Windows. Por estos motivos, es mejor utilizar las propiedades estáticas de la clase File como, por ejemplo, File.documentsDirectory.
Las rutas nativas reales para estos directorios variarán en función del sistema operativo y la configuración del equipo. Las rutas que se muestran en esta tabla representan ejemplos típicos. Siempre se deben utilizar las propiedades estáticas adecuadas de la clase File para hacer referencia a estos directorios de forma que la aplicación funcione correctamente en cualquier plataforma. En una aplicación real de AIR, los valores para applicationID y filename mostrados en la tabla proceden del descriptor de la aplicación. Si se especifica un ID de editor en el descriptor de la aplicación, este ID se añade al ID de la aplicación en estas rutas. El valor de userName es el nombre de la cuenta del usuario que realiza la instalación. Vista del directorio para aplicaciones de AIR para TVPara proporcionar seguridad a los archivos del sistema en dispositivos de AIR para TV, una aplicación de AIR sólo puede acceder a un conjunto limitado de directorios. AIR for TV impide que la aplicación acceda a cualquier otro directorio. Asimismo, AIR para TV aísla los datos específicos del usuario para todas las aplicaciones de AIR. La aplicación de AIR utiliza los nombres de directorio que sólo son para su uso con ActionScript 3.0. Estos nombres no representan los directorios reales en el dispositivo. AIR para TV asigna estos nombres de directorio de ActionScript 3.0 a los directorios del dispositivo reales. Con esta asignación las aplicaciones de AIR para TV se protegen frente al acceso inadvertido o malintencionado a los archivos locales que no les pertenecen. Los nombres de directorio de ActionScript 3.0 son:
Si una aplicación intenta acceder a un directorio prohibido, el motor de ejecución emite una excepción que el código de ActionScript puede detectar. En la siguiente tabla se muestra el valor File.nativePath para distintos métodos y propiedades File. Los valores reflejan la vista limitada de la aplicación del sistema de archivos del dispositivo.
También se debe tener en cuenta el comportamiento de los siguientes métodos en los dispositivos de AIR para TV:
Configuración de un objeto File para que apunte a un directorioExisten distintas formas de configurar un objeto File para que apunte a un directorio. Apuntar al directorio de inicio del usuarioUn objeto File puede apuntar al directorio de inicio del usuario. El siguiente código configura un objeto File para que apunte a un subdirectorio AIR Test del directorio de inicio: var file:File = File.userDirectory.resolvePath("AIR Test");
Apuntar al directorio de documentos del usuarioUn objeto File puede apuntar al directorio de documentos del usuario. El siguiente código configura un objeto File para que apunte a un subdirectorio AIR Test del directorio de documentos: var file:File = File.documentsDirectory.resolvePath("AIR Test");
Apuntar al directorio del escritorioUn objeto File puede apuntar al escritorio. El siguiente código configura un objeto File para que apunte a un subdirectorio AIR Test del escritorio: var file:File = File.desktopDirectory.resolvePath("AIR Test");
Apuntar al directorio de almacenamiento de la aplicaciónUn objeto File puede apuntar al directorio de almacenamiento de la aplicación. Para cada aplicación de AIR hay una ruta asociada exclusiva que define el directorio de almacenamiento de la aplicación. Este directorio es exclusivo para cada aplicación y usuario. Se puede utilizar este directorio para guardar datos que son específicos del usuario y la aplicación (como los archivos de datos de usuario o de preferencias). Por ejemplo, el siguiente código configura un objeto File para que apunte a un archivo de preferencias, prefs.xml, que se encuentra en el directorio de almacenamiento de la aplicación: var file:File = File.applicationStorageDirectory;
file = file.resolvePath("prefs.xml");
La ubicación del directorio de almacenamiento de la aplicación se suele basar en el nombre de usuario y el ID de la aplicación. Las siguientes ubicaciones del sistema de archivos se incluyen aquí para ayudar a depurar la aplicación. Siempre se debe usar la propiedad File.applicationStorage o app-storage: esquema de URI para resolver archivos en este directorio:
Nota: si una aplicación dispone de ID de edición, éste también se utiliza como parte de la ruta al directorio de almacenamiento de la aplicación.
La URL (y la propiedad url) para un objeto File creado con File.applicationStorageDirectory utiliza el esquema de URL app-storage (consulte Esquemas de URL compatibles de AIR), como en el ejemplo siguiente: var dir:File = File.applicationStorageDirectory;
dir = dir.resolvePath("preferences");
trace(dir.url); // app-storage:/preferences
Apuntar al directorio de la aplicaciónUn objeto File puede apuntar al directorio en el que se instaló la aplicación, al que se describe como directorio de la aplicación. Para ello se utiliza propiedad File.applicationDirectory. Este directorio puede utilizarse para examinar el archivo descriptor de la aplicación u otros recursos que haya instalados con la aplicación. Por ejemplo, el siguiente código configura un objeto File para que apunte a un directorio llamado images que se encuentra en el directorio de la aplicación: var dir:File = File.applicationDirectory;
dir = dir.resolvePath("images");
La URL (y la propiedad url) para un objeto File creado con File.applicationDirectory utiliza el esquema de URL app-storage (consulte Esquemas de URL compatibles de AIR), como en el ejemplo siguiente: var dir:File = File.applicationDirectory;
dir = dir.resolvePath("images");
trace(dir.url); // app:/images
Nota: en Android, no se puede acceder a los archivos del paquete de la aplicación a través de nativePath. La propiedad nativePath es una cadena vacía. Utilice siempre la dirección URL para acceder a los archivos en el directorio de la aplicación en lugar de una ruta nativa.
Apuntar a la raíz del sistema de archivosEl método File.getRootDirectories() enumera todos los volúmenes raíz -como C: y los volúmenes montados- de un ordenador con Windows. En Mac OS y Linux, este método siempre produce como resultado el directorio raíz exclusivo del ordenador (el directorio "/"). El método StorageVolumeInfo.getStorageVolumes() proporciona más información detallada sobre los volúmenes de almacenamiento montados (consulte Trabajo con volúmenes de almacenamiento). Nota: la raíz del sistema de archivos no se puede leer en Android. Se devuelve un objeto File que hace referencia al directorio con la ruta nativa, “/”, pero las propiedades de ese objeto no tienen valores precisos. Por ejemplo, spaceAvailable siempre es 0.
Apuntar a un directorio explícitoPara que un objeto File apunte a un directorio explícito, se configura la propiedad nativePath del objeto File, como en el ejemplo siguiente (en Windows): var file:File = new File(); file.nativePath = "C:\\AIR Test"; Importante: señalar a una ruta explícita de este modo puede implicar que el código no funcione en distintas plataformas. Por ejemplo, el ejemplo anterior sólo funciona en Windows. Se pueden utilizar las propiedades estáticas del objeto File como, por ejemplo, File.applicationStorageDirectory, para localizar un directorio que funcione en varias plataformas. Utilice el método resolvePath() (consulte la sección siguiente) para buscar una ruta relativa. Desplazarse a rutas relativasEl método resolvePath() sirve para obtener una ruta relativa a otra ruta determinada. En el ejemplo siguiente, el código configura un objeto File para que apunte a un subdirectorio "AIR Test" del directorio de inicio del usuario: var file:File = File.userDirectory;
file = file.resolvePath("AIR Test");
También se puede utilizar la propiedad url de un objeto File para que apunte a un directorio con base en una cadena URL, como en el ejemplo siguiente: var urlStr:String = "file:///C:/AIR Test/"; var file:File = new File() file.url = urlStr; Para ver más información, consulte Modificación de rutas de archivos. Dejar que el usuario utilice la función Examinar para seleccionar un directorioLa clase File incluye el método browseForDirectory(), que presenta un cuadro de diálogo del sistema que permite al usuario seleccionar un directorio para asignarlo al objeto. El método browseForDirectory() es asíncrono. Distribuye un evento select si el usuario selecciona un directorio y hace clic en el botón Abrir, o distribuye un evento cancel si el usuario hace clic en el botón Cancelar. Por ejemplo, con el siguiente código el usuario puede seleccionar un directorio y se produce una ruta a ese directorio al seleccionarlo: var file:File = new File();
file.addEventListener(Event.SELECT, dirSelected);
file.browseForDirectory("Select a directory");
function dirSelected(e:Event):void {
trace(file.nativePath);
}
Nota: en Android, no se admite el método browseForDirectory(). La llamada a este método no tiene efecto; un evento cancel se distribuye de forma inmediata. Para que los usuarios puedan seleccionar un directorio, se debe utilizar un cuadro de diálogo personalizado y definido por la aplicación.
Apuntar al directorio desde el que se invocó la aplicaciónLa ubicación del directorio desde el cual se invoca una aplicación puede obtenerse comprobando la propiedad currentDirectory del objeto InvokeEvent que se distribuye al invocar la aplicación. Para obtener más información, consulte Captura de argumentos de la línea de comandos. Configuración de un objeto File para que apunte a un archivoExisten distintas formas de configurar el archivo al que apunta un objeto File. Apuntar a una ruta de archivo explícitaImportante: señalar a una ruta explícita puede implicar que el código no funcione en distintas plataformas. Por ejemplo, la ruta C:/foo.txt sólo funciona en Windows. Se pueden utilizar las propiedades estáticas del objeto File como, por ejemplo, File.applicationStorageDirectory, para localizar un directorio que funcione en varias plataformas. Utilice el método resolvePath() (consulte Modificación de rutas de archivos) para buscar una ruta relativa. Se puede utilizar la propiedad url de un objeto File para que apunte a un archivo o un directorio con base en una cadena URL, como en el ejemplo siguiente: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File() file.url = urlStr; También se puede pasar la URL a la función constructora File(), como en el ejemplo siguiente: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File(urlStr); La propiedad url siempre produce la versión codificada en formato URI de la URL (por ejemplo, los espacios en blanco se sustituyen con "%20"): file.url = "file:///c:/AIR Test"; trace(file.url); // file:///c:/AIR%20Test Se puede utilizar también la propiedad nativePath de un objeto File para definir una ruta explícita. Por ejemplo, cuando se ejecuta en un ordenador con Windows, el código que aparece a continuación configura un objeto File para que apunte al archivo test.txt en el subdirectorio AIR Test de la unidad C:. var file:File = new File(); file.nativePath = "C:/AIR Test/test.txt"; También se puede pasar esta ruta a la función constructora File(), como en el ejemplo siguiente: var file:File = new File("C:/AIR Test/test.txt");
Utilice el carácter de barra diagonal (/) como delimitador para la propiedad nativePath. En Windows, también puede utilizar el carácter de barra diagonal inversa (\), pero esto implica que las aplicaciones no funcionen en distintas plataformas. Para ver más información, consulte Modificación de rutas de archivos. Enumeración de los archivos de un directorioEl método getDirectoryListing() de un objeto File sirve para obtener un conjunto de objetos File que apuntan a archivos y subdirectorios en el nivel raíz de un directorio. Para obtener más información, consulte Enumeración de directorios. Dejar que el usuario utilice la función Examinar para seleccionar un archivoLa clase File incluye los siguientes métodos que presentan un cuadro de diálogo del sistema que permite al usuario seleccionar un archivo para asignarlo al objeto:
Todos estos métodos son asíncronos. Los métodos browseForOpen() y browseForSave() distribuyen el evento "select" cuando el usuario selecciona un archivo (o una ruta de destino, en el caso de browseForSave()). Con los métodos browseForOpen() y browseForSave(), al seleccionarlo el objeto File de destino apunta a los archivos seleccionados. El método browseForOpenMultiple() distribuye un evento selectMultiple cuando el usuario selecciona varios archivos. El evento selectMultiple es del tipo FileListEvent, el cual tiene una propiedad files que es un conjunto de objetos File (que apuntan a los archivos seleccionados). Por ejemplo, el siguiente código presenta al usuario un cuadro de diálogo “Abrir” que le permite seleccionar un archivo: var fileToOpen:File = File.documentsDirectory;
selectTextFile(fileToOpen);
function selectTextFile(root:File):void
{
var txtFilter:FileFilter = new FileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml");
root.browseForOpen("Open", [txtFilter]);
root.addEventListener(Event.SELECT, fileSelected);
}
function fileSelected(event:Event):void
{
trace(fileToOpen.nativePath);
}
Si en la aplicación ya estaba abierto otro cuadro de diálogo con la función examinar cuando se llama a un método de examinar, el motor de ejecución emite una excepción de Error. Modificación de rutas de archivosSe puede también modificar la ruta de un objeto File existente llamando al método resolvePath() o modificando la propiedad nativePath o url del objeto, como en los ejemplos siguientes (en Windows): var file1:File = File.documentsDirectory;
file1 = file1.resolvePath("AIR Test");
trace(file1.nativePath); // C:\Documents and Settings\userName\My Documents\AIR Test
var file2:File = File.documentsDirectory;
file2 = file2.resolvePath("..");
trace(file2.nativePath); // C:\Documents and Settings\userName
var file3:File = File.documentsDirectory;
file3.nativePath += "/subdirectory";
trace(file3.nativePath); // C:\Documents and Settings\userName\My Documents\subdirectory
var file4:File = new File();
file4.url = "file:///c:/AIR Test/test.txt";
trace(file4.nativePath); // C:\AIR Test\test.txt
Al usar la propiedad nativePath, utilice el carácter de barra diagonal (/) como carácter separador de directorios. En Windows, también se puede emplear el carácter de barra diagonal inversa (\), pero no es recomendable, ya que implica que el código no funcione en distintas plataformas. Esquemas de URL compatibles de AIREn AIR, Al definir la propiedad url de un objeto File se puede utilizar cualquiera de los esquemas de URL siguientes:
Búsqueda de la ruta relativa entre dos archivosEl método getRelativePath() sirve para buscar la ruta relativa entre dos archivos: var file1:File = File.documentsDirectory.resolvePath("AIR Test");
var file2:File = File.documentsDirectory
file2 = file2.resolvePath("AIR Test/bob/test.txt");
trace(file1.getRelativePath(file2)); // bob/test.txt
El segundo parámetro del método getRelativePath(), el parámetro useDotDot, permite que se incluya la sintaxis .. en los resultados para indicar directorios superiores: var file1:File = File.documentsDirectory;
file1 = file1.resolvePath("AIR Test");
var file2:File = File.documentsDirectory;
file2 = file2.resolvePath("AIR Test/bob/test.txt");
var file3:File = File.documentsDirectory;
file3 = file3.resolvePath("AIR Test/susan/test.txt");
trace(file2.getRelativePath(file1, true)); // ../..
trace(file3.getRelativePath(file2, true)); // ../../bob/test.txt
Versiones canónicas de nombres de archivoEn los nombres de ruta y archivo no se distingue entre mayúsculas y minúsculas en Windows y Mac OS. En el siguiente ejemplo, dos objetos File apuntan al mismo archivo: File.documentsDirectory.resolvePath("test.txt");
File.documentsDirectory.resolvePath("TeSt.TxT");
No obstante, los documentos y nombres de directorio sí incluyen mayúsculas. En los siguientes ejemplos se da por sentado que existe una carpeta llamada AIR Test en el directorio de documentos: var file:File = File.documentsDirectory.resolvePath("AIR test");
trace(file.nativePath); // ... AIR test
file.canonicalize();
trace(file.nativePath); // ... AIR Test
El método canonicalize() convierte el objeto nativePath para que figuren correctamente las mayúsculas en el nombre del archivo o directorio. En los sistemas de archivos que distinguen entre mayúsculas y minúsculas (como Linux), cuando existen varios archivos con nombres que difieren únicamente en las mayúsculas y minúsculas, el método canonicalize() ajusta la ruta para que coincida con el primer archivo encontrado (en un orden que determina el sistema de archivos). El método canonicalize() también sirve para convertir nombres de archivo cortos (nombres "8.3") en nombres de archivo largos en Windows, como en los ejemplos siguientes: var path:File = new File(); path.nativePath = "C:\\AIR~1"; path.canonicalize(); trace(path.nativePath); // C:\AIR Test Trabajo con paquetes y vínculos simbólicosDiversos sistemas operativos admiten archivos de paquetes y archivos de vínculos simbólicos: Paquetes En Mac OS, los directorios pueden designarse como paquetes y aparecer en el Finder de Mac OS archivo sencillo en lugar de como directorio. Vínculos simbólicos Mac OS, Linux y Windows Vista admiten este tipo de vínculos. Los vínculos simbólicos permiten que un archivo apunte a otro archivo o directorio del disco. Si bien son similares, los vínculos simbólicos no son lo mismo que los alias. Un alias siempre se notifica como archivo (y no como directorio) y la lectura o escritura en un alias o acceso directo no afecta nunca el archivo o directorio original al que apunta. Por otro lado, un vínculo simbólico se comporta exactamente igual que el archivo o directorio al que apunta. Se puede notificar como archivo o directorio, y la lectura o escritura en un vínculo simbólico afecta al archivo o directorio al que apunta y no al propio vínculo simbólico. Asimismo, en Windows la propiedad isSymbolicLink para un objeto File que hace referencia a un punto de unión (utilizado en el sistema de archivos NTFS) se establece en true. La clase File incluye las propiedades isPackage y isSymbolicLink para comprobar si un objeto File remite a un paquete o a un vínculo simbólico. El código siguiente itera a través del directorio del escritorio del usuario, enumerando los subdirectorios que no son paquetes: var desktopNodes:Array = File.desktopDirectory.getDirectoryListing();
for (var i:uint = 0; i < desktopNodes.length; i++)
{
if (desktopNodes[i].isDirectory && !!desktopNodes[i].isPackage)
{
trace(desktopNodes[i].name);
}
}
El código siguiente itera a través del directorio del escritorio del usuario, enumerando los archivos y directorios que no son vínculos simbólicos: var desktopNodes:Array = File.desktopDirectory.getDirectoryListing();
for (var i:uint = 0; i < desktopNodes.length; i++)
{
if (!desktopNodes[i].isSymbolicLink)
{
trace(desktopNodes[i].name);
}
}
El método canonicalize() modifica la ruta de un vínculo simbólico para apuntar al archivo o directorio al que se refiere el vínculo. El código siguiente itera a través del directorio del escritorio del usuario y notifica las rutas referenciadas por archivos que son vínculos simbólicos: var desktopNodes:Array = File.desktopDirectory.getDirectoryListing();
for (var i:uint = 0; i < desktopNodes.length; i++)
{
if (desktopNodes[i].isSymbolicLink)
{
var linkNode:File = desktopNodes[i] as File;
linkNode.canonicalize();
trace(linkNode.nativePath);
}
}
Determinación del espacio disponible en un volumenLa propiedad spaceAvailable de un objeto File es el espacio (expresado en bytes) que está disponible para ser utilizado en el lugar donde se encuentra el archivo. Por ejemplo, el código siguiente comprueba el espacio disponible en el directorio de almacenamiento de la aplicación: trace(File.applicationStorageDirectory.spaceAvailable); Si el objeto File remite a un directorio, la propiedad spaceAvailable indica el espacio en el directorio que utilizan los archivos. Si el objeto File remite a un archivo, la propiedad spaceAvailable indica el espacio en el que podría ampliarse el archivo. Si no existe la ubicación de archivo, la propiedad spaceAvailable se define en 0. Si el objeto File remite a un vínculo simbólico, la propiedad spaceAvailable se define en el espacio disponible en el lugar al que apunta el vínculo simbólico. El espacio disponible para un directorio o archivo suele ser el mismo que el que está disponible en el volumen que contiene el directorio o el archivo. No obstante, el espacio disponible puede ajustarse teniendo en cuenta los cupos y límites por directorio. Para añadir un archivo o directorio a un volumen se suele necesitar más espacio que el tamaño mismo del archivo o del contenido del directorio. Por ejemplo, el sistema operativo puede necesitar más espacio para guardar la información del índice. O los sectores del disco que se requieren pueden usar espacio adicional. Además, el espacio que hay disponible cambia constantemente. Por todo ello es que no se puede asignar todo el espacio notificado a guardar los archivos. Para ver más información sobre la escritura en el sistema de archivos, consulte Lectura y escritura de archivos. El método StorageVolumeInfo.getStorageVolumes() proporciona más información detallada sobre los volúmenes de almacenamiento montados (consulte Trabajo con volúmenes de almacenamiento). Apertura de archivos con la aplicación del sistema predeterminadaEn AIR 2, es posible abrir un archivo utilizando la aplicación registrada por el sistema operativo para abrirla. Por ejemplo, una aplicación de AIR puede abrir un archivo DOC con la aplicación resgitrada para abrirlo. Utilice el método openWithDefaultApplication() de un objeto File para abrir el archivo. Por ejemplo, el siguiente código abre un archivo denominado test.doc en el escritorio del usuario y lo abre con la aplicación predeterminada para los archivos DOC: var file:File = File.deskopDirectory;
file = file.resolvePath("test.doc");
file.openWithDefaultApplication();
Nota: en Linux, el tipo MIME del archivo (no la extensión del nombre de archivo) determina la aplicación predeterminada para un archivo.
El siguiente código permite al usuario buscar un archivo mp3 y abrirlo en la aplicación predeterminada para reproducir archivos mp3: var file:File = File.documentsDirectory;
var mp3Filter:FileFilter = new FileFilter("MP3 Files", "*.mp3");
file.browseForOpen("Open", [mp3Filter]);
file.addEventListener(Event.SELECT, fileSelected);
function fileSelected(e:Event):void
{
file.openWithDefaultApplication();
}
El método openWithDefaultApplication() no se puede utilizar con archivos ubicados en el directorio de la aplicación. AIR impide el uso del método openWithDefaultApplication() para abrir determinados archivos. En Windows, AIR impide la apertura de archivos de determinados tipos como, por ejemplo, EXE o BAT. En Mac OS y en Linux, AIR impide abrir archivos que inician una aplicación específica. (Estos incluyen Terminal y AppletLauncher en Mac OS; y csh, bash o ruby en Linux.) Si se intenta abrir uno de estos archivos con el método openWithDefaultApplication(), se generará una excepción. Para obtener una lista de los tipos de archivo con limitaciones, consulte la entrada de la referencia del lenguaje del método File.openWithDefaultApplication(). Nota: esta limitación no existe en aplicaciones de AIR instaladas utilizando un archivo de instalación nativo (una aplicación de escritorio ampliada); consulte Empaquetado de una aplicación de AIR en un archivo de instalación nativo.
|
|