【问题标题】:How to read/write file with iOS, in simulator as well as on device?如何在 iOS、模拟器和设备上读取/写入文件?
【发布时间】:2012-06-20 04:11:48
【问题描述】:

由于我需要在启动应用程序时读取文件并有时在使用它时写入文件,因此我尝试通过以下方式访问它:

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

而应该在我的项目文件夹中的文件却在模拟器文件夹中:

2012-06-13 17:36:56.398 MyFileApp[610:15203] /Users/Rob/Library/Application Support/iPhone Simulator/5.1/Applications/1FFD4436-DCCA-4280-9E47-F6474BEE0183/MyFileApp.app/我的文件.txt

所以如果我想在模拟器和真机上读/写它,我该怎么办?

感谢您的建议

【问题讨论】:

    标签: objective-c ios nsfilemanager read-write


    【解决方案1】:
    #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
    

    【讨论】:

      【解决方案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】:

        对于写入文件,如果您链​​接到 Foundation 框架,则可以使用 -[NSData writeToURL:atomically:]-[NSString writeToURL:atomically:encoding:error:] 方法。

        读取文件的方法是-[NSData initWithContentsOfURL:options:error:]-[NSString initWithContentsOfURL:encoding:error:]

        【讨论】:

          【解决方案4】:

          要从包中读取文件,请执行以下操作

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

          请注意,您将无法在应用程序的 bundle 文件夹中写入文件

          【讨论】:

          • 如果我使用文档文件夹中的文件,它将与模拟器一起使用,但是当我在设备上使用我的应用程序时,该怎么办?使用捆绑文件夹?
          • 对,我知道你用 NSHomeDirectory 做了什么。非常感谢!
          • 我只需要最后的信息。我有一个名为 myFileApp 的文件夹,其中包含一些文件夹(和另一个文件夹 myFileApp),这个文件夹包含我的 .m/.h 文档和我的数据文件。使用此配置,我必须在 stringByAppendingPathComponent 中使用什么路径?
          • 如果这是在你的包中,那么使用我添加的第一行,从包资源中加载它:)
          • 嗯,我明白了...所以事实上,当应用程序启动时,我必须阅读我的捆绑文件,然后将其复制到沙箱中,然后在此处进行所有编辑?如果我最终想在退出应用程序时用沙盒的文件替换捆绑包的文件?对不起,这有点难以理解..
          猜你喜欢
          • 1970-01-01
          • 2021-01-29
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 2021-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多