Deb не устанавливается, если в имени файла есть пробел

Итак, в моем приложении у меня есть представление таблицы. Если файл является deb, он просит установить, нажимаю «Установить», и он перенаправляет меня к контроллеру представления, который показывает установку, похожую на iFile и Cydia (не так гламурно с выводом, лол).

В этом аспекте все нормально. Он устанавливает. Однако. Если файл имеет пробел в имени, то есть random File.deb, он не работает. Я заметил, что iFile разобрался с этим, попытался связаться с ними, чтобы узнать, могут ли они просветить меня о ситуации, но ответа пока нет.

Как мне сбежать из космоса? или сделать вид, что dpkg все равно, что он там?

Вот как я вызываю и выполняю install.

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 NSTasks. 1 распаковать и 2 настроить? Я пробовал это, но он не перешел ко второй задаче или все равно увидел бы первую запущенную и заблокировал dpkg.

Любое понимание или знание будут оценены.


person ChrisOSX    schedule 03.06.2015    source источник
comment
вы не можете использовать 2>/tmp/dpkg.log в качестве аргумента для NSTask, потому что этот аргумент должен интерпретироваться оболочкой, а не dpkg. NSTask не интерпретирует автоматически синтаксис оболочки, такой как | или >!   -  person Michael    schedule 04.06.2015
comment
dpkg.log — это файл журнала, созданный при открытии моего табличного представления. Как только deb выбирается для установки, он считывает вывод, напечатанный в этом файле журнала. Возможно, это неправильный способ, но он работает для того, что я делаю.   -  person ChrisOSX    schedule 04.06.2015


Ответы (1)


Вы запускаете приложение командной строки, поэтому вам ДОЛЖЕН выполняться, как если бы вы сами вводили это в командной строке.

Это устанавливает пакет, названный из файла с именем foo, и передает какой-то дополнительный странный/неизвестный аргумент bar.deb в dpkg.

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

Это устанавливает пакет из файла с именем «foo bar.deb».

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

Обратите внимание на кавычки... Вы также можете использовать \ для экранирования пробела, но тогда вы должны понимать, что вам нужно ДВОЙНОЕ экранирование: один раз для вашего obj-C и один раз для оболочки.

person Marc B    schedule 03.06.2015
comment
Как бы мне избежать пробела, если бы пробел мог быть в случайном месте в имени файла? - person ChrisOSX; 04.06.2015