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!