我正在尝试编写一个将 wine 和一些 .exe 文件包装在一起的应用程序。应用程序将挂载 WineBottlerCombo_1.2.5.dmg 文件,然后它应该自动将挂载的 Wine 的正确内容复制到 Application 文件夹。完成后,它应该运行一个 .exe 文件(由我指定)。
我的问题是:
- 如何在不自动打开挂载的 .dmg 文件的情况下挂载 .dmg 文件
- 如何将挂载的 .dmg 文件的内容复制到 Application 文件夹
- 完成这一切之后,我如何使用 Objective-C 运行 .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);
}
不幸的是,这不会将这些文件移动到应用程序文件夹。我调试了它,它进入了 if 语句,所以它是真的,但是没有文件被移动到 Application 文件夹。
这就是我被卡住的地方。我试图搜索互联网,但我无法获得任何信息如何继续前进,所以我想我在这里问。
提前感谢您的帮助。
编辑:
我检查了 NSFileManager copyItemPath 中的第三个参数,它显示以下内容:
2013-05-04 11:16:03.493 TestApp_MacOSX_installer[10284:303] 写入失败并出现错误:错误域 = NSCocoaErrorDomain 代码 = 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);
}