【问题标题】:File read using contentsAtPath not working使用 contentsAtPath 读取的文件不起作用
【发布时间】:2014-03-30 16:30:22
【问题描述】:

以下是我的代码,newfile2 与 main.m 位于同一目录中(见图),但我收到 File read failed 错误。我哪里错了?

进口

int main(int argc, const char * argv[]) {

@autoreleasepool {

    NSFileManager *fm;
    NSData *fileData;

    fm = [NSFileManager defaultManager];

    //Read from the file nwefile2

    fileData = [fm contentsAtPath:@"newfile2"];

    if (fileData == nil) {
        NSLog(@"File read failed");
        return 1;
    }

    //Write the data to a file

    if ([fm createFileAtPath:@"newfile3" contents:fileData attributes:nil] == NO) {
        NSLog(@"File creation failed");
        return 2;
    }

    NSLog(@"File copy successful");
}
return 0;
}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    问题是这一行没有说明在哪里可以找到文件:

    fileData = [fm contentsAtPath:@"newfile2"];
    

    假设部分路径会找到该文件(可能是因为您认为工作目录与您的程序是同一目录?),但这是一个错误的假设。对工作目录是什么一无所知!您必须具体说明文件的位置。

    【讨论】:

    • 这样的字符串会起作用吗? ~/Desktop/Obj-C Excercises/16/16.2/16.2/newfile2
    • 不,~ 没有意义。但是您可以使用stringByStandardizingPath: 进行调整。
    • 我把我的新文件放在包含可执行文件的目录中。它现在正在工作。
    • 很酷,但基本上你只是在向自己隐藏问题。如果您正在尝试学习 Objective-C,尤其是。对于 iOS 或 Mac OS X 编程,以正确的方式进行将是更好的做法。你永远不会在现实生活中使用“工作目录”;您将始终指定完整路径。那么为什么现在不习惯呢?
    【解决方案2】:

    尽管对路径进行了硬编码,但指定路径的正确方法是在 NSBundle 类的 api 下面使用:-

    - (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension
    

    像下面这样写:-

      fileData = [fm contentsAtPath:[[NSBundle mainBundle] 
                                  pathForResource:@"newfile2" ofType:@"fileExt"]];
    

    注意:- 在获取文件路径之前,您的文件应该存在于资源目录中。

    【讨论】:

    • 你能告诉我这个资源目录在哪里吗?
    • 资源目录意味着它应该存在于您的应用程序包中。目前,您放置文件的位置称为资源目录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多