2015-06-03 32 views
0

所以在我的应用程序中我有一个表视图。如果一个文件是一个deb文件,它会要求安装,按安装,它会把我带到一个显示安装的视图控制器,类似于iFile和Cydia(不像输出lol那样迷人)。如果空间是文件名称Deb无法安装

在这方面一切都很好。它会安装。然而。如果文件的名称中有空格,即random File.deb,则会失败。我注意到iFile已经想通了,试着联系他们看看他们是否可以启发我,但没有回应。

我会怎样逃离这个空间?或让它看起来像dpkg不在乎它在那里?

这就是我如何调用并执行安装。

MyDownloadsViewController * vc = [[MyDownloadsViewController alloc] init]; 
vc.fileName = debName; 

// Get documents folder 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
path = [paths objectAtIndex:0]; 
path = [[@"~/Documents/myFolder" stringByExpandingTildeInPath] retain]; 

NSString *debPath = [path stringByAppendingPathComponent:vc.fileName]; 

//NSTask  
NSTask *task = [[NSTask alloc] init]; 
NSPipe *pipe = [NSPipe pipe]; 
[task setLaunchPath: myLaunchPath]; 
[task setArguments: [NSArray arrayWithObjects:@"/usr/bin/dpkg", @"-i", debPath, @"2>/tmp/dpkg.log" ,nil]]; 
[task setStandardOutput: pipe]; 
[task launch]; 

我已经尝试使用:

[filename stringByReplacingOccurrencesOfString:@" " withString:@""] 
同时在下载

发送的文件和输出视图控制器接收它。它要么失败,要么应用程序崩溃。

我也试过:

if ([fileName rangeOfString:@" "].location != NSNotFound) { 
    appendedFile = [path stringByReplacingOccurrencesOfString:@" " withString:@""];   
} 

以确定该文件有一个空间,如果不继续像正常。这有一些不想要的结果,并且它会安装表视图中的最后一个deb。

使用2个NSTask会更好吗? 1解包和第二个配置?我试过了,但它不会进入第二个任务,或者它仍然会看到第一个正在运行并锁定dpkg。

任何洞察力或知识将不胜感激。

+0

您不能使用'2>/tmp/dpkg.log'作为NSTask的参数,因为该参数应该由shell解释,而不是'dpkg'解释。 NSTask不会像'''或'>'那样自动解释类似shell的语法! – Michael

+0

dpkg.log是打开我的表视图时创建的日志文件。一旦安装了deb,它会读取打印到该日志文件的输出。这可能不是一种“正确”的方式,但它适用于我正在做的事情。 – ChrisOSX

回答

1

您正在执行命令行应用程序,因此您要执行HAVE,就好像您在shell提示符处自己输入的那样。

这将安装一个由名为foo文件名为包,并通过一些额外的怪异/未知参数bar.debdpkg

/usr/bin/dpkg -i foo bar.deb 

这从一个叫“富bar.deb”

文件安装包
/usr/bin/dpkg -i "foo bar.deb" 

请注意引号......您也可以使用\来逃避空间,但是您必须意识到您必须进行双重转义:一次为您的obj-C和一次为shell。

+0

如果空间可能位于文件名中的随机位置,我将如何逃离空间? – ChrisOSX

相关问题