2017-07-13 9 views
2

Je suis sur OSX, Objective-C.Cocoa/Objective-C obtient un chemin HFS (chemin: vers: desktop) à partir d'un chemin posix (chemin/vers/bureau)

J'ai un chemin/NSURL comme

/Users/xxx/Desktop/image2.png 

Mais je passe à une application tierce qui excpects finder pathes comme

Harddisk:Users:Desktop:image2.png 

est-il une méthode (je ne trouve pas) convertir des chemins comme ça ou les sortir d'un NSURL (si possible sans modification de chaîne)?

En AppleScript il est

return POSIX file "/Users/xxx/Desktop/image2.png" --> Harddisk:Users:xxx:Desktop:image2.png 

EDIT: Ceci est à peu près le même: Cocoa path string conversion Malheureusement, la méthode est dépréciée ...

Répondre

1

Il n'y a pas (facile) alternatif au moment.

La fonction CFURLCopyFileSystemPath n'est pas dépréciée, seul le cas enum kCFURLHFSPathStyle est dépréciée, mais la valeur brute 1 fonctionne toujours et évite l'avertissement.

J'utilise cette catégorie de NSString

@implementation NSString (POSIX_HFS) 

- (NSString *)hfsPathFromPOSIXPath 
{ 
    CFStringRef hfsPath = CFURLCopyFileSystemPath((CFURLRef)[NSURL fileURLWithPath:self], 1); 
    return (NSString *)CFBridgingRelease(hfsPath); 
} 
@end 

La fonction fonctionne également à Swift.

1

La réponse de Vadians est meilleure que celle-ci - mais si la méthode vadians est déconseillée, ce sera une alternative. L'idée est d'utiliser des méthodes applescripts pour obtenir un chemin HFS appelé facilement avec un osascript d'une catégorie NSString.

catégorie NSString (crédits: https://stackoverflow.com/a/19014463/4591992)

@implementation NSString (ShellExecution) 

- (NSString*)runAsCommand { 
    NSPipe* pipe = [NSPipe pipe]; 

    NSTask* task = [[NSTask alloc] init]; 
    [task setLaunchPath: @"/bin/sh"]; 
    [task setArguments:@[@"-c", [NSString stringWithFormat:@"%@", self]]]; 
    [task setStandardOutput:pipe]; 

    NSFileHandle* file = [pipe fileHandleForReading]; 
    [task launch]; 

    NSString* result = [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUTF8StringEncoding]; 
    return result; 
} 

@end 

Utilisation pour ce cas:

NSString* posixToHFS = [NSString stringWithFormat:@"osascript -e 'POSIX file \"%@\" as text'",filePath]; 
filePath = [posixToHFS runAsCommand]; 
+0

En termes de AppleScript: 'information for' des ajouts standard est Déconseillédepuis macOS 10.5 Leopard, mais il est je travaille encore. Et alors? ;-) – vadian

+0

'NSAppleScript' peut exécuter AppleScript. – Willeke