将捆绑的应用程序发送到Applications文件夹

时间:2011-06-20 19:04:13

标签: cocoa

我正在尝试将位于我的项目包中的应用程序移动到用户的Applications文件夹。捆绑的“testApp.app”位于项目Resources文件夹中。我的代码没有完成它。我如何指向用户系统上的全局Applications文件夹有什么问题吗?

感谢。

NSFileManager* fileManager = [NSFileManager defaultManager];

NSError *error = nil;

NSString *appDirectory = [NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *path =  [appDirectory stringByAppendingPathComponent:@"~/Applications/testApp.app"];
[path stringByExpandingTildeInPath];


if ([fileManager fileExistsAtPath:path isDirectory:NULL]) {
[fileManager removeItemAtPath:path error:&error];

}

if(![fileManager fileExistsAtPath:path]){       
}


NSData *data = [NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/testApp.app"]];
[data writeToFile:path atomically:YES];

3 个答案:

答案 0 :(得分:3)

.app“files”实际上不是文件,它们是目录(右键单击一个和“显示内容”)。因此,您需要复制它们。

您的代码还存在其他一些问题,[NSString stringBy...]消息会返回 new 字符串,因为NSString是不可变的,因此您需要分配返回值而不是仅传递消息。

答案 1 :(得分:2)

尝试这样的事情:

NSString *sourcePath = [[NSBundle mainBundle] 
                    pathForResource:@"testApp" ofType:@"app"];
if (sourcePath == nil) {
    NSLog(@"testApp.app was not found");
    return;
}
NSArray *appsFolders = NSSearchPathForDirectoriesInDomains(
             NSApplicationDirectory, NSUserDomainMask, YES);
if ([appsFolders count] == 0) {
    NSLog(@"~/Applications/ not found");
    return;
}
NSString *appsFolder = [appsFolders objectAtIndex:0];
NSString *destPath = [appsFolder stringByAppendingPathComponent:@"testApp.app"];
NSFileManager *fileManager = [NSFileManager defaultManager];

[fileManager removeItemAtPath:destPath error:&error];

if (![fileManager copyItemAtPath:sourcePath toPath:destPath error:&error]) {
    NSLog(@"failed to copy %@ to %@", sourcePath, destPath);
}

请注意,在您的代码中,您将appDirectory设置为可扩展为/Users/<username>/Applications之类的内容,并且以下行等同于以下内容:

NSString *path = [@"/Users/<username>/Applications"
 stringByAppendingPathComponent:@"~/Applications/testApp.app"];

这可能不是你想要的。

答案 2 :(得分:1)

Andy Kim在GitHub上公开他的解决方案(LetsMove)。你可以找到它here