Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>XCode: NSTask - Problem mit dem Heimverzeichnis -> ~/Desktop/

XCode: NSTask - Problem mit dem Heimverzeichnis -> ~/Desktop/

Netter Chef29.12.0614:58
Hi!

Ich habe das Problem, dass ich auf dem Schreibtisch ein neuer Ordner erzeugen will. Mit dem Terminal-Befehl

mkdir ~/Desktop/XCodekopie

klappt dies prima.

Jetzt will ich diesen Befehl aus XCode in einem Programm aus aufrufen.

Dazu habe ich mir folgenden Code zusammengebastelt:




#import "Foo.h"

@implementation Foo

- (IBAction)erzeugen:(id)sender
{

NSTask *task = [[NSTask alloc] init];
// set complete launch path
[task setLaunchPath:@"/bin/mkdir"];
// set arguments

[task setArguments:[NSArray arrayWithObjects:@"~/Desktop/XCodekopie", nil]];


// run task, wait for exit, get exit code
[task launch];
[task waitUntilExit];
int status = [task terminationStatus];
// release task and display error if any
[task release];
if(status != 0) NSLog(@"Error");

}

@end


Ich vermute, dass es an der Tilde liegt. Ich muss aber die Tilde verwenden, da ich nicht wissen kann, wie der Heimordner des Benutzers lautet.

Vielleicht kann mal jemand über den Code drüber gucken. Mit Google nach NSTask und mkdir zu suchen hat leider nicht viel gebracht.
0

Kommentare

xplorer29.12.0615:25
Vlt. sowas in der Richtung:
NSString *shortPath = @"~/Desktop/XCodekopie";
NSString *absolutePath = [shortPath stringByExpandingTildeInPath];
0
Sebastian
Sebastian29.12.0615:27
Generell würde ich sagen guck Dir mal stringByExpandingTildeInPath von NSString an.

Wenn es aber nur ums Erstellen eines Verzeichnisses angeht würde ich Dir NSFileManager nahelegen.
0
Netter Chef29.12.0615:59
eszett
oder ganz banal:

system("mkdir ~/Desktop/XCodekopie");

aber das ist Dir vermutlich zu banal ...

cool. Das klappt! DANKE
0
Rantanplan
Rantanplan29.12.0616:05
Netter Chef
cool. Das klappt! DANKE

Ist aber die unsaubere Lösung. Warum hast du nicht den richtigen Tip ernstgenommen?
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Netter Chef29.12.0616:07
Was meinst Du mit "unsauber"? =-O
0
MacRabbitPro29.12.0617:02
Also normalerweise sind bei Cocoa die ganzen Filesystemoperationen in der Klasse NSFileManager gekapselt. Die sollte, wenn man ein Cocoa konformes Programm schreiben will, auch allen anderen Methoden vorgezogen werden.
0
MacRabbitPro29.12.0617:16
Netter Chef

Wie würde denn das Error-Handling bei Deinem Codebeispiel aussehen?
Würdest Du den Standard Out und Standard Error Stream abfangen und darin dann herumpharsen ob das mkdir geklappt hat?

Ist nicht wirklich dein Ernst - oder?
0
Rantanplan
Rantanplan29.12.0617:59
Jo, das Errorhandling ist umständlicher als bei der richtigen Benutzung der API. Außerdem kann man Programme die system() auf diese Weise benutzen wunderbar zur Schadsoftware umfunktionieren
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Netter Chef29.12.0618:03
Rantanplan: Wenn man schaden will kann man doch direkt die BASH-Befehle aufrufen, statt erst umständliche fremde Programme?

eszett: zu den Shells: Also das Programm ist für OS X 10.4, wenn 10.5 ne andere Bash hat, kann ich es ja dann mit dem neuen XCode 3 neu kompilieren.

eszett: Sind 2 Prozesse schlecht?

MacRabbitPro: Gar kein Error-Handling. NIL. Wenns geklappt ist gut, ansonsten gehts halt nicht. Wollte da nichts abfangen.
0
Rantanplan
Rantanplan29.12.0618:10
Netter Chef
MacRabbitPro: Gar kein Error-Handling. NIL. Wenns geklappt ist gut, ansonsten gehts halt nicht. Wollte da nichts abfangen.

Ja ok. Ich glaube dann können wir das hier beenden MacRabbitPro und ich leben von der Softwareentwicklung. Für so eine Einstellung - Fehler werden nicht abgefangen - würde man uns an der obersten Rahe aufhängen und wir könnten uns die Brötchen bei der Caritas abholen Mach mal dein Programm. Zumindest wirst du uns nicht arbeitslos machen können
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Netter Chef29.12.0618:38
och Du, da gibt es sehr viele Firmen, die Software ausliefert, die Fehler nicht abfängt oder sogar logische Fehler enthält. Warum sich den Stress machen, wenns auch schneller geht. Notfalls bessert man nach.
0
Netter Chef29.12.0618:40
ich stamme noch aus alten BASIC und TURBO PASCAL Zeiten.

kann man nicht erinnern dass man damals jemals fehler abgefangen hat. vielleicht mal ne abfrage, dass bei der eingabe von zahlen, kein text reinkommt, damit pascal-programm nicht abstürtzt, aber das war schon das höchste der gefühle. DEBUGGER habe ich z.B. noch nie verwendet.
0
Rantanplan
Rantanplan29.12.0618:45
Stimmt schon, daß viele Programme so hemdsärmelig geschrieben sind. Aber ich persönlich kriege davon einen Würgereflex ... da würde ich am liebsten am Hals des Entwicklers würgen
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Netter Chef29.12.0619:17
naja, ich programmiere ja nicht für Geld.
ist ja nur für mich und meinen Bekanntenkreis.
0
Rantanplan
Rantanplan29.12.0620:10
Dachte ich mir schon, deswegen meinte ich ja, wir können die Diskussion über Für und Wider der obigen Lösung einstellen. Sie tut was du willst und für Hobbyzwecke ist das schon in Ordnung.
„Wenn ich nicht hier bin, bin ich auf dem Sonnendeck“
0
Netter Chef29.12.0620:41
genau. DANKE nochmal an alle die mir geholfen haben! Insbesondere an eszett.
0
MacRabbitPro29.12.0620:41
Netter Chef

Ich wüßte nicht was das Abfangen eines Fehlers mit der Programmiersprache zu tun hat. Auf in Basic oder Pascal kann man Fehler behandeln.
Das hat eher was mit der Professionalität und dem Pflichtbewußtsein des Programmierers zu tun.

In jeder professionellen Software ist der Großteil des Codes Fehlerbehandlung oder Datenkontrolle zur Fehlervermeidung.

Aber - und da schließe ich mich Rantanplan - bei dem was du daheim herumbastelst und auf deinen Bekanntenkreis losläßt spielt eine vernünftige Programmierung wohl keine große Rolle.
0
Netter Chef29.12.0620:44
PS: Bevor ich gefragt werde:

Nein, ich male vorher keine Struktogramme
Nein, die Struktogramme übertrage ich dann nicht in UML-Diagramme
Nein, ich dokumentiere nichts. // und /* kenne ich gar nicht.

0
MacRabbitPro29.12.0620:45
Netter Chef

solange du der einzige bist der deinen eigenen Code warten muß ist das auch vollkommen in Ordnung!
0
Eszett
Eszett29.12.0615:34
oder ganz banal:

system("mkdir ~/Desktop/XCodekopie");

aber das ist Dir vermutlich zu banal ...
0
Eszett
Eszett29.12.0615:35
Ach ja, die Tilde wird dann bei system() von der entsprechenden Shell ausgewertet (i.a. bash).
0
Eszett
Eszett29.12.0616:59
"unsauber" ist es, weil:

- ein extra neuer Prozeß erzeugt wird (die Shell),
- noch ein neuer Prozeß erzeugt wird ("mkdir"),
- die Tilde mglw. bei einigen Shells (Bourne?) nicht funktioniert.

Vorteil ist aber, daß es ANSI ist, geht also auch auf Unixen ohne die NSxxxx-API.
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.