我正在尝试编写一个将wine和一些.exe文件包装在一起的应用程序。应用程序将挂载WineBottlerCombo_1.2.5.dmg文件,然后它应该自动将已安装的Wine的正确内容复制到Application文件夹。完成此操作后,它应该运行.exe文件(由我指定)。
我的问题是:
我真的是Objective-C的初学者,但我正在努力解决这个问题。我是通过在Xcode中创建Cocoa应用程序开始的。在此之后,我设法使用此代码挂载.dmg文件(因为它会自动打开已安装的.dmg文件,非常适合阻止它):
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/hdiutil"];
[task setArguments:
[NSArray arrayWithObjects: @"attach", @"/Users/<myusername>/Documents/temporary/WineBottlerCombo_1.2.5.dmg", nil]];
[task launch];
[task waitUntilExit];
if (0 != [task terminationStatus])
NSLog(@"Mount failed.");
[task release];
在此之后,我尝试使用此代码将已安装的.dmg文件内容复制到Application文件夹:
if( [[NSFileManager defaultManager] isReadableFileAtPath: @"/Volumes/WineBottler Combo"] ) {
[[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/Wine" toPath: @"/Volumes/WineBottler Combo/Applications" error:nil];
[[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/WineBottler" toPath: @"/Volumes/WineBottler Combo/Applications" error:nil];
}
else {
NSString* message = @"ERROR while moving file!";
NSLog(@"%@", message);
}
不幸的是,这并没有将这些文件移动到Application文件夹。我对它进行了调试,并且它进入了if语句,所以它变为现实,但没有文件被移动到Application文件夹。
这是我被困的地方。我试图搜索互联网,但我还没有得到任何关于如何继续前进的信息,所以我想我在这里问。
提前感谢您的帮助。
编辑:
我检查了NSFileManager copyItemPath中的第三个参数,它说明了以下内容:
2013-05-04 11:16:03.493 TestApp_MacOSX_installer [10284:303]写入失败并显示错误:错误Domain = NSCocoaErrorDomain Code = 260“由于没有此类文件,无法打开文件”Wine“。” UserInfo = 0x10015a530 {NSFilePath = / Volumes / WineBottler Combo / Wine,NSUnderlyingError = 0x10015a430“操作无法完成。没有这样的文件或目录”}
我不知道它为什么没有这样的文件或目录,因为在程序安装后我在终端检查了这条路径并且路径正确,文件就在那里。
编辑编辑:
解决第一条EDIT错误消息:
我注意到我离开了我要复制的文件的扩展名。 所以正确的代码如下所示:
if( [[NSFileManager defaultManager] isReadableFileAtPath: @"/Volumes/WineBottler Combo"] ) {
[[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/Wine.app" toPath: @"/Volumes/WineBottler Combo/Applications/Wine.app" error:&anyError];
NSLog(@"Write failed with error: %@", anyError);
[[NSFileManager defaultManager] copyItemAtPath: @"/Volumes/WineBottler Combo/WineBottler.app" toPath: @"/Volumes/WineBottler Combo/Applications/WineBottler.app" error:nil];
NSLog(@"Write failed with error: %@", anyError);
}
else {
NSString* message = @"ERROR while moving file!";
NSLog(@"%@", message);
}
答案 0 :(得分:2)
man hdiutil
,看起来需要传递-nobrowse
参数。error:
)并查看它的内容。