2012-02-27 5 views
18

Consideriamo i seguenti due esempi di codice:Perché utilizzare un NSFileManager anziché utilizzare semplicemente il metodo writeToFile di NSData: atomically: metodo durante la creazione di un nuovo file?

NSData *imgData = UIImagePNGRepresentation(imgFull); 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path 
    [imgData writeToFile:fullPath atomically:YES]; 

e

NSData *imgData = UIImagePNGRepresentation(imgFull); 
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager createFileAtPath:fullPath contents:imgData attributes:nil]; 

Il secondo esempio richiede una linea aggiuntiva di codice e l'inizializzazione di un oggetto NSFileManager, mentre il primo esempio è semplicemente l'oggetto NSData imgData si scrive su un file. Un ulteriore vantaggio del primo esempio è che può sovrascrivere un file preesistente con lo stesso nome.

La mia domanda è: quando si creano nuovi file, in quali circostanze si vorrebbe effettivamente utilizzare NSFileManager e il suo metodo createFileAtPath:contents:attributes:?

+0

Il writeToFile di NSData non sovrascrive come impostazione predefinita, in base alla mia esperienza. E nemmeno NSFileManager crea createFileAtPath con attributi: nil.Informazioni sugli attributi Il metodo NSDictionary è imminente, suggerendo che non è spesso usato. –

risposta

35

Il vantaggio del metodo NSFileManager è il campo attributes:

Un dizionario che contiene gli attributi da associare al nuovo file. È possibile utilizzare questi attributi per impostare il proprietario e i numeri di gruppo, i permessi dei file e la data di modifica. Per un elenco di chiavi, vedere "Chiavi di attributo file". Se si specifica nil per gli attributi, il file viene creato con un set di attributi predefiniti.

Questa funzione è insolita da utilizzare su iOS, ma lo NSFileManager è molto più vecchio di iOS.

BTW, la linea in eccesso che stai descrivendo non compare quasi mai in codice reale. O si dispone già di una variabile fileManager che si stava utilizzando per altri motivi, o si combinano le due linee in una sola:

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil]; 

E solo un altro. Come si nota:

Un ulteriore vantaggio del primo esempio è la possibilità di sovrascrivere un file preesistente con lo stesso nome.

Bene, questo è un vantaggio o uno svantaggio a seconda di ciò che si desidera. Se si intende "creare questo file, ma non sovrascriverlo se già esiste", il metodo FM è molto più conveniente. Forse è un errore sovrascrivere un file esistente; questo ti fa risparmiare la chiamata a fileExistsAtPath:. Forse vuoi creare un file vuoto se non è lì, ma lasciarlo solo se lo è. Semplice: passare il valore [NSData data] come valore contents.

Quindi, ciò che è meglio dipende dal problema che stai risolvendo.

+0

Ottima risposta, e grazie per aver brevemente toccato la raison d'etre più ampia e non iOS della classe NSFileManager. – maxedison

+0

Ottima risposta davvero. Grazie Rob – Eugene

+0

sotto SandBox, sta diventando sempre più diverso. Spero che Rob possa aggiornare la risposta. Grazie! –

0

in base alle mie conoscenze e dopo aver letto la risposta di Rob, la maggior parte delle operazioni sui file può essere eseguita utilizzando l'oggetto file manager condiviso. perché ogni percorso genera una sola volta. Quindi non può sorgere la situazione di override. Per favore, correggi se ho torto.

0

Recentemente, ho trovato che writeToFile:atomically: non si adatta bene quando l'unità verifica il codice. Per rendere confortevole il test ho dovuto iniettare NSFileManager nella classe e nel test ho usato il gestore di file deriso per verificare il comportamento.