2012-06-18 18 views
10

Jak muszę odczytać plik, kiedy moja aplikacja jest uruchomiona i napisać to czasami podczas korzystania z niego, starałem się dotrzeć z:Jak odczytać/zapisać plik na iOS, w symulatorze, a także na urządzeniu?

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

i plik, który powinien być w moim folderze projektu, to zamiast w folderze symulatora:

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

Więc jeśli chcę go odczytać/zapisać za pomocą symulatora, a także prawdziwego urządzenia, co powinienem zrobić?

Dzięki za rady

+0

Nie trzeba zmieniać – Hector

Odpowiedz

20

Aby odczytać plik z pakietu wykonaj następujące czynności

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

Aby odczytać go z pamięci piaskownicy (dokumenty)

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

Aby napisać do dokumentu folder

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

Należy pamiętać, że nie można zapisać pliku w folderze z pakietami aplikacji

+1

Jeśli używam pliku z mojego folderu dokumentów, będzie on działał z symulatorem, ale kiedy używam mojej aplikacji na urządzeniu, co robić? Użyj folderu pakietu? – Rob

+2

Nie podoba się ten kod na symulatorze i urządzeniu :) –

+0

Dobrze, widzę, co robisz za pomocą NSHomeDirectory. Wielkie dzięki ! – Rob

1

W przypadku plików zapisu stosowane są metody -[NSData writeToURL:atomically:] i -[NSString writeToURL:atomically:encoding:error:], które można zastosować, jeśli utworzono łącze do struktury Foundation.

Do odczytu plików stosowane są metody -[NSData initWithContentsOfURL:options:error:] i -[NSString initWithContentsOfURL:encoding:error:].

2

Oto co trzeba do zapisu i odczytu pliku tekstowego:

zapisać plik:

-(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]; 
} 

i odczytu pliku:

-(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]; 
} 

i wreszcie przetestować mojego kodu pod adresem 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