Сохранение информации о профиле системы в файле .spx с помощью NSTask - PullRequest
1 голос
/ 26 февраля 2010

В Какао я пытаюсь реализовать кнопку, которая, когда пользователь нажимает на кнопку, захватывает отчет системного профилировщика и вставляет его на рабочий стол.

код

 NSTask *taskDebug;
NSPipe *pipeDebug;
 taskDebug = [[NSTask alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(taskFinished:)       name:NSTaskDidTerminateNotification object:taskDebug];
 [profilerButton setTitle:@"Please Wait"];
 [profilerButton setEnabled:NO];

  [taskDebug setLaunchPath: @"/usr/sbin/system_profiler"];

  NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-detailLevel",@"full",@">", @" 
    ~/Desktop/Profiler.spx",nil];
  [taskDebug setArguments:args];


  [taskDebug launch];

Но это не сохраняет файл на рабочий стол. имеющий NSArray * args = [NSArray arrayWithObjects: @ "- xml", @ "- detailLevel", @ "full", nil] работает и сбрасывает весь вывод sys profiler в окне консоли.

Любые советы о том, почему это не работает или как лучше это реализовать? Я пытаюсь воздержаться от использования сценария оболочки или APpleScript, чтобы получить системный профилировщик. Если ничего не получится, это будет мой последний вариант. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 26 февраля 2010
NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-detailLevel",@"full",@">", @"~/Desktop/Profiler.spx",nil];

Это не сработает, потому что вы не проходите через оболочку, а > является оператором оболочки. (Кроме того, ~ не является особенным, кроме случаев, когда вы расширяете его с помощью stringByExpandingTildeInPath.)

Создайте NSFileHandle для записи в этот файл Profiler.spx, убедившись, что используется полный абсолютный путь, а не сокращенный путь тильды. Затем устанавливает этот NSFileHandle в качестве стандартного вывода задачи . По сути, это то, что делает оболочка, когда вы используете в ней оператор >.

1 голос
/ 27 февраля 2010

Это сделано (спасибо Питеру и Костику)

[taskDebug setLaunchPath: @"/usr/sbin/system_profiler"];    
NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-         detailLevel",@"full",nil];


[taskDebug setArguments:args];

[[NSFileManager defaultManager] createFileAtPath: [pathToFile stringByExpandingTildeInPath] contents: nil attributes: nil];

outFile = [ NSFileHandle fileHandleForWritingAtPath:[pathToFile stringByExpandingTildeInPath]];

[taskDebug setStandardOutput:outFile];
[taskDebug launch];
0 голосов
/ 26 февраля 2010

Создайте NSPipe, отправьте [taskDebug setStandardOutput: myPipe] и прочитайте из дескриптора файла канала.

...