目标C访问NSBundle

时间:2012-11-19 14:56:55

标签: objective-c cocoa nsbundle

我有几个问题和一些问题:

我想做什么:

将MyApp.app/Assets/Debug/debug.xml中的文件重命名为MyApp.app/Assets/Debug/debug_2.xml

1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"debug" ofType:"xml" inDirectory:@"Assets"]; returns (null)

2. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"debug" ofType:"xml" inDirectory:@"Debug"]; returns (null)

3. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"debug" ofType:"xml"]; WORKS(it finds the file EVEN if its not in the .app its in .app/Assets/Debug.xml)

BUT:

    if ([fm fileExistsAtPath:path]) {

NSString *newPath = [[NSBundle mainBundle] pathForResource:@"newfile" ofType:@"xml"];   

            [fm copyItemAtPath:path toPath:newPath error:NULL];

        } else {
            NSLog(@"File does not exists");
        }

代码总是抛出这个错误:

-[NSFileManager copyItemAtPath:toPath:error:]: destination path is nil'

当然文件不存在,但它的路径与文件路径相同..只是用另一个名称:)

我想重命名.app文件夹中的文件,其路径与另一个名称相同。

任何帮助表示赞赏!

同样在上面的示例1和2中:如果我使用inDirectory参数,为什么它会给我空路径?我在构建资源中添加了一个文件夹等等。我测试了所有

由于

3 个答案:

答案 0 :(得分:2)

您无法修改应用程序包中的资源。它基本上是只读的。 pathForResource方法仅返回现有文件的路径。

您必须将任何新文件写入文档或缓存目录。你把它们放在哪里取决于它们是否可以重新生成以及它们是否应该备份。有关详细信息,请参阅this documentation

答案 1 :(得分:0)

如果要在应用程序沙箱中创建目录:

applicationDataFolder = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; //OR NSDocumentsDirectory
    NSString* libraryFolderPath = [[[MAFCore sharedInstance] applicationDataFolder] stringByAppendingPathComponent:@"myFolder"];
    BOOL dirExists = [[NSFileManager defaultManager] fileExistsAtPath:libraryFolderPath];
    if(dirExists == NO){
        [[NSFileManager defaultManager] createDirectoryAtPath:libraryFolderPath withIntermediateDirectories:NO attributes:nil error:nil];
    }

答案 2 :(得分:0)

您需要阅读开发人员手册以了解您使用的方法......

我会为你解释一下:

pathForResource:ofType:inDirectory:

  

如果inDirectory为nil,则此方法搜索顶级非本地化   资源目录和任何特定语言的顶级   目录。 [cut]例如,假设你有一台Mac OS X.   使用现代捆绑包的应用程序,并指定 @“Assets”   子路径参数。这种方法首先要看   目录/资源/资产捆绑包的目录......

,您的文件不在目录/资源/资产

pathForResource:不适用于现有文件。

您需要做什么:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"debug" ofType:"xml"];
NSString *newPath = [filePath stringByDeletingLastPathComponent];
newPath = [newPath stringByAppendingPathComponent:@"debug_2.xml"];