我正在尝试将位于我的项目包中的应用程序移动到用户的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];
答案 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。