2012-06-18 27 views
10

Như tôi cần phải đọc một tập tin khi ứng dụng của tôi được đưa ra và viết nó đôi khi trong khi sử dụng nó, tôi đã cố gắng để đạt được nó với:Cách đọc/ghi tệp với iOS, trong trình mô phỏng cũng như trên thiết bị?

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

Và các tập tin, mà phải ở trong thư mục dự án của tôi, là thay vì trong thư mục trình mô phỏng:

2012-06-13 17: 36: 56.398 MyFileApp [610: 15203]/Người dùng/Rob/Library/Hỗ trợ ứng dụng/iPhone Simulator/5.1/Applications/1FFD4436-DCCA-4280- 9E47-F6474BEE0183/MyFileApp.app/myFile.txt

Vì vậy, nếu tôi muốn đọc/ghi nó bằng cách sử dụng giả lập cũng như thiết bị thực, tôi nên làm gì?

Cám ơn lời khuyên của bạn

+0

không cần thay đổi – Hector

Trả lời

20

Để đọc các tập tin từ gói thực hiện như sau

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

Để đọc nó từ lưu trữ sandbox của bạn (tài liệu)

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

Để ghi vào tài liệu thư mục

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

Xin lưu ý rằng bạn sẽ không thể ghi tệp trong thư mục gói của ứng dụng của bạn

+1

Nếu tôi sử dụng tệp từ thư mục tài liệu của mình, nó sẽ hoạt động với trình mô phỏng, nhưng khi tôi sử dụng ứng dụng trên thiết bị, phải làm gì? Sử dụng thư mục gói? – Rob

+2

Không có mã này sẽ hoạt động trên cả trình mô phỏng và thiết bị :) –

+0

Phải, tôi thấy những gì bạn làm bằng cách sử dụng NSHomeDirectory. Cảm ơn rất nhiều ! – Rob

1

Để ghi tệp, các phương pháp là và -[NSString writeToURL:atomically:encoding:error:] có thể được sử dụng nếu bạn liên kết đến khuôn khổ Foundation.

Đối với tệp đọc, các phương pháp là -[NSData initWithContentsOfURL:options:error:]-[NSString initWithContentsOfURL:encoding:error:].

2

Dưới đây là những gì bạn cần phải viết và đọc một văn bản tập tin:

Viết một tập tin:

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

và đọc một 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]; 
} 

và cuối cùng tôi kiểm tra mã của tôi tại 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