2015-06-03 31 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

相關問題