2010-02-26 4 views
1

Dans Cocoa, j'essaie d'implémenter un bouton qui, lorsque l'utilisateur clique sur, va capturer le rapport de profil du système et le coller sur le bureau.Enregistrement d'informations de profilage système dans un fichier .spx à l'aide de NSTask

code

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]; 

Mais cela ne sauve pas le fichier sur le Bureau. Avoir NSArray * args = [NSArray arrayWithObjects: @ "- xml", @ "- detailLevel", @ "full", nil] fonctionne et il supprime toute la sortie du profileur sys dans la fenêtre de la console.

Des conseils pour expliquer pourquoi cela ne fonctionne pas ou comment mieux implémenter cela? J'essaie de ne pas utiliser un script shell ou APpleScript pour obtenir le profileur de système. Si rien ne fonctionne, ce serait ma dernière option. Merci d'avance.

Répondre

1

Ce fait (AVEZ OBTENU grâce à Pierre et Costique)

[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

Créez un NSPipe, envoyez [taskDebug setStandardOutput: myPipe] et lisez depuis le descripteur de fichier du tube.

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

Cela ne marchera pas parce que vous n'êtes pas passer par le shell et > est un opérateur shell. (En outre, ~ n'est pas spécial, sauf lorsque vous développez à l'aide stringByExpandingTildeInPath.)

Create an NSFileHandle for writing à ce fichier Profiler.spx, en veillant à utiliser le chemin absolu, pas le chemin abrégé tilde. Puis, set that NSFileHandle as the task's standard output. C'est essentiellement ce que fait le shell lorsque vous utilisez un opérateur >.