3

我正在尝试编写一个将 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);
}
4

1 回答 1

2
  • 关于挂载:请参阅man hdiutil, 看起来您需要传递-nobrowse参数。
  • 复制:我建议你将第三个参数传递给方法(error:),看看它说什么。
  • 要运行 .exe 文件,您可能需要运行将 .exe 文件作为参数传递的 wine 可执行文件。与第一种情况相同的方法:使用 NSTask
于 2013-05-03T18:32:54.887 回答