2017-07-13 122 views
2

我在OSX上,Objective-C。Cocoa/Objective-C從posix路徑(路徑/到/桌面)獲取HFS路徑(路徑:到:桌面)

我有一個像

/Users/xxx/Desktop/image2.png 

的路徑/ NSURL但我把它傳遞給excpects取景pathes像

Harddisk:Users:Desktop:image2.png 

第三方應用程序是否有任何方法(我找不到)轉換那樣的pathes或者讓它們脫離NSURL(如果可能,不用修改字符串)?

在AppleScript的是

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

編輯:這是幾乎相同的:Cocoa path string conversion 不幸的是,該方法已不...

回答

1

有一個在沒有(容易)替代時刻。

函數CFURLCopyFileSystemPath不被棄用,只有枚舉案例kCFURLHFSPathStyle已被棄用,但原始值1仍在工作並且避免了警告。

我使用這一類的NSString

@implementation NSString (POSIX_HFS) 

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

功能也工作在斯威夫特。

1

Vadians的答案比這個更好 - 但如果vadians方法被棄用,這將是一個替代方案。想法是使用applescripts方法通過NSString類別的osascript輕鬆調用HFS路徑。

的NSString類別(學分: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 

用法:

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

在AppleScript的方面:'信息for'標準添加的,因爲MacOS的10.5 Leopard的過時,但它是還在工作。所以呢? ;-) – vadian

+0

'NSAppleScript'可以執行AppleScript。 – Willeke