Cocoa - Relative Pfade

B

buzz-dee

Neues Mitglied
Thread Starter
Dabei seit
24.03.2003
Beiträge
18
Reaktionspunkte
0
Hallo Leute,

gibt es eine Möglichkeit, in Obj-C, relative Pfade zu verwenden? Ich habe neben dem Programm einen Ordner mit Daten, auf das mein Prog. zugreifen soll. Habe es mit @"./" versucht. Dann klappt's im Release- und Debug-Folder. Wenn ich die ganzen Sachen allerdings auf den Desktop ziehe, funktioniert es nicht mehr.

Habe folgende 2 Ansätze, die funktionieren:

Code:
NSMutableString *path =[NSMutableString stringWithString:[[NSBundle mainBundle]bundlePath]];
for(int i=[path length]; i>0; i--){
	if([[path substringWithRange:NSMakeRange(i-1, 1)] compare:@"/"]!=NSOrderedSame){
		[path deleteCharactersInRange:NSMakeRange(i-1, 1)];
	}else{
		break;
	}
}

und

Code:
NSString *path =[NSBundle mainBundle]bundlePath];

NSMutableArray *pathComponents = [NSMutableArray arrayWithArray:[path pathComponents]];
[pathComponents removeObjectAtIndex:0];
[pathComponents removeLastObject];
NSString *newPath = [NSString stringWithFormat:@"/%@/", [pathComponents componentsJoinedByString:@"/"]];

Kann mir allerdings bei beiden nicht vorstellen, dass sie annähernd optimal sind. Leider hab ich in der Doku keine weiteren Anhaltspunkte gefunden :-(
 
Hallo SumpfMonsterJun,

sorry, vielleicht habe ich mich nicht deutlich genug ausgedückt: Ich möchte den absoluten Pfad der aktuellen Anwendung auslesen, damit ich aus einem Ordner, der neben der Anwendung liegt z.B. eine Textdatei lesen oder einen Sound abspielen kann.

Wenn sich z.B. ein Programm "PlaySound.app" auf dem Desktop befindet und sich auf dem Desktop auch ein Ordner "Sounds" befindet, dann möchte ich nicht sagen
Code:
snd = [[NSSound alloc]initWithContentsOfFile:@"/Users/xyz/Desktop/Sounds/sound.mp3"];
sondern eine relative Pfadangabe übergeben, damit das ganze auch noch an einem anderen Ort funktioniert.
Code:
snd = [[NSSound alloc]initWithContentsOfFile:@"./Sounds/sound.mp3"];
tut das leider scheinbar nicht überall.


Habe inzwischen die String-Methode stringByDeletingLastPathComponent gefunden. Damit scheint's zu funktionieren:
Code:
path = [NSString stringWithFormat:@"%@/", [[[NSBundle mainBundle]bundlePath]stringByDeletingLastPathComponent]];
 
Warum packst Du die benötigten Dateien nicht einfach mit ins Programmbundle und lädst sie von da über die entsprechende NSBundle Methode?

Die Dateien scheinen ja zum Programm zu gehören. Ansonsten müsstest Du, z.B. über ein Sheet, den Benutzer nach dem Ort fragen.

Gruß, SMJ
 
Jepp!

Wenn es ein konstanter Nutzerordner sein soll, dann gibt man den Pfad in den Defaults ein.

Aber "Verschiebst du mich, musst du den Ordner verschieben BITTE DRAN DENKEN" ist keine Lösung, sondern ein Problem.
 
Hallo,

also das Programm ist für eine Musik- / Lichtsteuerung. Es git einen dynamischen Pool, in dem für jeden Tag ein Ordner mit 3 Soundfiles und einer Textdatei für die Lichtsteuerung liegt. Nun wird jeden Tag einer dieser Ordner verwendet. Beim ersten und zweiten Durchgang wird lediglich ein Sound aus diesem Ordner abgespielt. Beim dritten Durchgang kommt noch das Licht dazu.

Das Problem ist, dass die Daten (Musik- und Text-Dateien) von relativ unerfahrenen Benutzern gepflegt werden soll. Nun möchte ich nicht, dass diese Leute am Bundle Veränderungen vornehmen. Die einfachste Möglichkeit sah ich nun darin, das Programm und den Ordner zusammen auf den Desktop zu legen. Mit der Variante, die ich zuletzt probiert habe (siehe letzter Post) funktioniert das auch.

Allerdings scheint das mit den Defaults wirklich die elegantere Methode zu sein. Dann kann ich die Daten in den Application Support legen und für die Benutzer einen Link auf den Desktop legen.

Danke für Eure Vorschläge!
 
[[NSBundle mainBundle] bundlePath]

Ist der Pfad Deiner App

Alex
 
Wenn du in den Defaults den Pfad stehen hast, kannst du auch den Datenordner $sonstwo hinlegen und das Programm in den Applications-Ordner stopfen.
 
Vielleicht hilft Dir das ja auch weiter:

http://developer.apple.com/DOCUMENT...ef/c/func/NSSearchPathForDirectoriesInDomains

Könntest Dir dann ein Unterverzeichnis in der Art bauen:

Code:
- (NSString *)applicationSupportFolder {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();
    NSString *applicationSupportFolder = [basePath stringByAppendingPathComponent:[ [ NSProcessInfo processInfo ] processName ]];
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ( ![fileManager fileExistsAtPath:applicationSupportFolder isDirectory:NULL] ) {
        [fileManager createDirectoryAtPath:applicationSupportFolder attributes:nil];
    }
    return applicationSupportFolder;
}

Gruß, SMJ
 
Zurück
Oben Unten