Come leggere e scrivere un file su disco

Objective-C

Poter scrivere o leggere un file dal disco ci permette di aggiungere funzionalità interessanti alla nostra app.

Ad esempio possiamo implementare una cache per le immagini, salvare i dati creati dall’utente, scaricare file dalla rete e tanto altro.

Ma vediamo come poter creare e salvare dei file.
Partiamo con un semplice file di testo.

Prepariamo il campo di gioco:

// 1.
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

// 2.
NSError* error = nil;

1. Prendiamo il percorso completo della cartella dei documenti dell’app.
2. Dichiariamo anche un NSError per controllare gli eventuali errori durante la procedura.

// 3.
NSString* textFilePath = [documentsPath stringByAppendingPathComponent:@"file.txt"];

// 4.
NSString* text = @"Questo è un semplice file di testo";

// 5.
[text writeToFile:textFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error];

NSLog(@"File saved (error: %@)", error);

3. Quindi creiamo il percorso e il filename del nostro nuovo file.
4. Dichiariamo e creiamo una semplice NSString contenente il testo da salvare.
5. Scriviamo quindi il file.

Se tutto va bene dovremmo vedere scritto sul debugger:

File saved (error: (null))

Adesso proviamo a rileggere questo file:

NSString* readText = [[NSString alloc] initWithContentsOfFile:textFilePath encoding:NSUTF8StringEncoding error:&error];
	
NSLog(@"File loaded %@; (error: %@)", readText, error);

La sintassi è davvero semplice, una riga di codice. Il debugger dirà:

File loaded Questo è un semplice file di testo; (error: (null))

Semplice no? Andiamo adesso a complicare leggermente le cose.

E se fosse un’immagine?

Assumiamo di avere un’immagine nella nostra app, dentro il Bundle dell’app.
(Il Bundle è il pacchetto dell’app stessa, dove vengono inseriti tutti i file contenuti ed aggiunti al progetto)

// 1.
NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"sample_image" ofType:@"png"];

// 2.
NSData* imageData = [NSData dataWithContentsOfFile:imagePath];

// 3.
UIImage* image = [UIImage imageWithData:imageData];
	
NSLog(@"Image Loaded %@", image);

1. Recuperiamo il percorso del nostro file. In questo caso è “sample_image.png” che è stato aggiunto al progetto.
2. Leggiamo il file dal disco sottoforma di NSData (dati puri).
3. Creiamo un oggetto UIImage da questi dati.

A questo punto avremo la nostra immagine e il debugger ci dirà:

Image Loaded

Proviamo a salvarla sul disco, nella cartella dei documenti dell’app.

// 1.
NSData* saveImageData = UIImageJPEGRepresentation(image, 0.8);

// 2.
NSString* imageFilePath = [documentsPath stringByAppendingPathComponent:@"image.jpg"];

// 3.	
BOOL saved = [saveImageData writeToFile:imageFilePath atomically:YES];
	
NSLog(@"Image saved %d", saved);

1. Creiamo un NSData dalla nostra immagine. In questo caso sarà la rappresentazione JPEG con qualità all’80%.
2. Dichiariamo e creiamo il path e il nome dell’immagine.
3. Scriviamo i dati nel disco.

Se tutto è andato come previsto il debugger scriverà:

Image saved 1

Ecco quindi che abbiamo letto e scritto un file di testo e un’immagine.

Pensate a tutte le possibilità adesso!

Scritto il