2012-06-18 18 views
10

Come ho bisogno di leggere un file quando la mia app è lanciato e scriverlo a volte durante l'utilizzo, ho cercato di raggiungere con:Come leggere/scrivere file con iOS, sia nel simulatore che sul dispositivo?

NSString *dataFile = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"]; 
NSLog(@"%@",dataFile); 

e il file, che dovrebbe essere nella mia cartella del progetto, è invece nella cartella simulatore:

2012-06-13 17: 36: 56,398 MyFileApp [610: 15203]/Users/Rob/Library/Application Support/iPhone simulator/5.1/Applicazioni/1FFD4436-DCCA-4280- 9E47-F6474BEE0183/MyFileApp.app/myFile.txt

Quindi, se voglio leggerlo/scriverlo usando il simulatore e il dispositivo reale, cosa dovrei fare?

Grazie per i vostri consigli

+0

c'è bisogno di cambiare – Hector

risposta

20

Per leggere il file dal bundle effettuare le seguenti operazioni

NSString *dataFile = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"]; 

Per leggere dalla vostra memoria sandbox (documenti)

NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/YourFile.txt"]; 
NSString *dataFile = [NSString stringWithContentsOfFile:docPath 
              usedEncoding:NSUTF8StringEncoding 
                error:NULL]; 

di scrivere al documento cartella

NSString *docPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/YourFile.txt"]; 
[dataFile writeToFile:docPath 
      atomically:YES 
      encoding:NSUTF8StringEncoding 
       error:NULL]; 

prega di notare che non sarà in grado di scrivere il file nella cartella pacchetto dell'applicazione

+1

Se uso un file da cartella Documenti che possa funzionare con il simulatore, ma quando uso la mia applicazione su un dispositivo, che cosa fare? Usa la cartella del pacchetto? – Rob

+2

Nope questo codice funziona su entrambi simulatore e dispositivo :) –

+0

Destra, vedo quello che fai con NSHomeDirectory. Molte grazie ! – Rob

1

Per scrivere file i metodi sono -[NSData writeToURL:atomically:] e -[NSString writeToURL:atomically:encoding:error:] possono essere utilizzati se si collega al quadro Fondazione.

Per la lettura dei file i metodi sono e -[NSString initWithContentsOfURL:encoding:error:].

2

Ecco cosa è necessario scrivere e leggere un file di testo:

scrivere un file:

-(void) writeStringToFile:(NSString *)aString{ 
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *fileName = @"textFile.txt"; 
    NSString *fileAtPath = [filePath stringByAppendingString:fileName]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:fileAtPath]) { 
     [[NSFileManager defaultManager] createFileAtPath:fileAtPath contents:nil attributes:nil]; 
    } 
    [[aString dataUsingEncoding:NSUTF8StringEncoding] writeToFile:fileAtPath atomically:NO]; 
} 

e leggere un file:

-(NSString *)readStringFromFile{ 
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *fileName = @"textFile.txt"; 
    NSString *fileAtPath = [filePath stringByAppendingString:fileName]; 
    return [[NSString alloc] initWithData:[NSData dataWithContentsOfFile:fileAtPath] encoding:NSUTF8StringEncoding]; 
} 

e finalmente ho testare il mio codice a viewDidLoad:

NSString *text = @"I'm an iOS developer and I'm living at HCM city"; 
    [self writeStringToFile:text]; 
    NSString *strResult = [self readStringFromFile]; 
    NSLog(@"%@", strResult); 
0
#import "ViewController.h" 

@interface ViewController() 

@property (strong, nonatomic) IBOutlet UITextView *txtWriteText; 
@property (strong, nonatomic) IBOutlet UIButton *btnWriteFile; 
@property (strong, nonatomic) IBOutlet UIButton *btnReadFile; 
@property (strong, nonatomic) IBOutlet UILabel *lblReadText; 

- (IBAction)btnWriteFileTouched:(id)sender; 
- (IBAction)btnReadFileTouched:(id)sender; 

@property NSFileManager *filemgr; 
@property NSString *docsDir; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _filemgr =[NSFileManager defaultManager]; 
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    _docsDir = dirPaths[0]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

- (IBAction)btnWriteFileTouched:(id)sender { 
    NSString *filePath = [_docsDir stringByAppendingPathComponent: @"texfile.txt"]; 
    NSData *databuffer = [@"PREFIX: " dataUsingEncoding: NSASCIIStringEncoding]; 
    [_filemgr createFileAtPath: filePath contents: databuffer attributes:nil]; 

    NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:        filePath]; 
    if (file == nil){ 
     NSLog(@"Failed to open file"); 
     return; 
    } 

    NSMutableData *data = [NSMutableData dataWithData:[_txtWriteText.text dataUsingEncoding:NSASCIIStringEncoding]]; 

    [file seekToEndOfFile]; 
    [file writeData: data]; 
    [file closeFile]; 
} 

- (IBAction)btnReadFileTouched:(id)sender { 
    NSString *filePath = [_docsDir stringByAppendingPathComponent: @"texfile.txt"]; 
    NSData *databuffer; 
    NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath: filePath]; 
    if (file == nil){ 
     NSLog(@"Failed to open file"); 
     return; 
    } 

    databuffer = [file readDataToEndOfFile]; 
    [file closeFile]; 

    NSString *datastring = [[NSString alloc] initWithData: databuffer encoding:NSASCIIStringEncoding]; 
    _lblReadText.text = datastring; 
} 

@end