Как читать/записывать файлы с iOS, в симуляторе, а также на устройстве?

Поскольку мне нужно прочитать файл при запуске моего приложения и иногда его писать при его использовании, я попытался связаться с ним:

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

И файл, который должен находиться в моей папке проекта, находится в папке симулятора:

2012-06-13 17: 36: 56.398 MyFileApp [610: 15203]/Пользователи/Rob/Library/Поддержка приложений /iPhone Simulator/5.1/Приложения/1FFD4436-DCCA-4280-9E47-F6474BEE0183/MyFileApp.app/myfile.txt

Итак, если я хочу читать/записывать его с использованием симулятора, а также реального устройства, что мне делать?

Спасибо за ваши советы

Ответ 1

Чтобы прочитать файл из пакета, сделайте следующее

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

Чтобы прочитать его из хранилища песочницы (документов)

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

Чтобы записать в папку документа

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

Обратите внимание, что вы не сможете записать файл в папке пакета вашего приложения

Ответ 2

Вот что вам нужно написать и прочитать текст файла:

Записать файл:

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

и прочитайте файл:

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

и, наконец, я проверяю свой код на viewDidLoad:

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

Ответ 3

Для файлов записи методы -[NSData writeToURL:atomically:] и -[NSString writeToURL:atomically:encoding:error:] могут использоваться, если вы ссылаетесь на фреймворк Foundation.

Для чтения файлов методы -[NSData initWithContentsOfURL:options:error:] и -[NSString initWithContentsOfURL:encoding:error:].

Ответ 4

#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