domingo, 4 de noviembre de 2012

Manejo de directorios en Objective-C


Un elemento clave en cualquier sistema que no sea muy pequeño, es el manejo de archivos. Por lo general, el manejo de archivos en el lenguaje C, en el cual se basa Objectibve-C, siempre es un poco complicado. Sin embargo, el framework Foundation, nos ayudará con varios métodos que nos harán la vida menos complicada, bueno, al menos el manejo de los archivos.

Las clases NSFileManager, NSFileHandle y NSData

NSFileManager - Esta clase puede ser utilizada para realizar operaciones básicas con archivos o carpetas como crear, mover, leer y escribir archivos y leer y modificar los atributos de los mismos. También cuenta con métodos para manejar los directorios, como leer su contenido, moverlos, borrarlos, etc.

  • NSFileHandle - Esta clase provee de operaciones de bajo nivel y de alto rendimiento, como búsqueda, lectura y escritura de arrchivos.
  • NSData - Esta clase maneja un buffer donde se puede leer y escribir los datos en un archivo.

Los nombre de las rutas de los archivos en Objective-C

Para las clases que se mencionan, los caminos de los archivos se manejan como en UNIX. Utilizamos la diagonal (/) para separar las carpetas. Si no inicia con la diagonal, entonces se considera a partir del directorio actual.

La carpeta inicial (o home) del cual puede el usuario iniciar, se maneja con una tilde (~). Su un archivo se escribe como  ~/miArchivo.m se hace referencia al archivo raiz del usuario. También se puede hacer la referencia a un directorio raíz de un usuario por medio de la tilde, por ejemplo ~pancho/demo.m, busca el directorio raíz del usuario "pancho".

Obteniendo la referencia por omisión con el objeto NSFileManager

La clase NSFileManager contiene un método llamado defaultManager podemos obtener la referencia a la carpeta donde se encuentra la aplicación:

NSFileManager *raiz;
raíz = [NSFileManager defaultManager];

A partir de este archivo, podemos utilizarlo de como apuntador para a partir de él, leer archivos y directorios.

Definir el directorio actual

El directorio de trabajo se puede obtener con el método currentDirectoryPath de la clase  NSFileManager. El método regresa el valor como una cadena NSString:

NSFileManager *raiz;
NSString *directorioActual;

raiz = [NSFileManager defaultManager];

directorioActual = [raiz currentDirectoryPath];

NSLog (@"El directorio actual es %@", directorioActual);

Cambio de directorio

Por medio del método changeCurrentDirectoryPath podemos cambiar de directorio de la aplicación. El nuevo destino del directorio es pasada como parámetro como un objeto NSString. Este método regresará un valor Booleano (YES/NO) para indicar si el cambio se efectuó en forma exitodsa o si existió un error:

NSFileManager *raiz;
NSString *dirActual;

raiz = [NSFileManager defaultManager];

dirActual = [raiz currentDirectoryPath];

NSLog (@"El directorio actual es %@", dirActual);

if ([raiz changeCurrentDirectoryPath: @"/temp/mydir"] == NO)
        NSLog (@"Error al cambiar de directorio.");

dirActual = [raiz currentDirectoryPath];

NSLog (@"El directorio actual es %@", dirActual);

Crear un nuevo directorio

Podemos crear un nuevo directorio por medio del método createDirectoryAtURLpasándole como un argumento a una instancia de la clase NSURL. Podemos pasarle diferentes atributos para el directorio:

NSFileManager *raiz;

raiz = [NSFileManager defaultManager];
NSURL *newDir = [NSURL fileURLWithPath:@"/tmp/mynewdir"];
[raiz createDirectoryAtURL: newDir withIntermediateDirectories:YES attributes: nil error:nil];

El método createDirectoryAtURL regresa un valor booleano indicando si la operación fue exitosa o no.

Borrar un directorio

Un directorio puede ser borrado del disco del sistema utilizando el mètodo removeItemAtPath, pasando como argumento el directorio que se desee eliminar:

An existing directory may be removed from the file system using the removeItemAtPath method, passing though the path of the directory to be removed as an argument:
 
NSFileManager *raiz;

raiz= [NSFileManager defaultManager];

[raiz removeItemAtPath: @"/tmp/mynewdir" handler: nil];

Renombrar o mover un directorio

Un directorio puede ser movido o renombreado usando el método moveItemAtURL. Este método toma como argumentos el origen y el destino por medio de objetos NSURL y es necesario que el objeto final NO EXISTA. Si el objeto destino ya existe, el étodo regresara un valor booleano negativo (NO):

NSFileManager *raiz;

raiz = [NSFileManager defaultManager];

NSURL *dirOrigen= [NSURL fileURLWithPath:@"/tmp/mynewdir"];
NSURL *dirNuevo= [NSURL fileURLWithPath:@"/tmp/mynewdir2"];

[raiz moveItemAtURL: dirOriegan toURL: dirNuevo error: nil];

Leer la lista de archivos del directorio

La lista de los archivos contenidos en un directorio se puede obtener por medio del método contentsOfDirectoryAtPath. Este método toma como argumento el camino del directorio que se desea leer como una cadena NSString y regresa un arreglo con los nombre de los archivos y subdirectorios contenidos:

NSFileManager *raiz;
NSString *dirActual;
NSArray *listaArchivos;
int num;
int i;

raiz= [NSFileManager defaultManager];

listaArchivos= [raiz contentsOfDirectoryAtPath: @"/tmp" error: nil];

num= [listaArchivos count];

for (i = 0; i < num; i++)
        NSLog (@"%@", [listaArchivos objectAtIndex: i]);

1 comentario:

  1. Hola lei el artículo y me parecio muy bueno lo implementé y lo permite pero no se donde guarda el archivo generado... me podria ayudar?

    ResponderEliminar