Как преобразовать классический путь HFS в путь POSIX - PullRequest
0 голосов
/ 27 марта 2019

Я читаю старые файлы, которые до сих пор используют пути в стиле HFS, например VolumeName:Folder:File.

Мне нужно преобразовать их в пути POSIX.

Я не люблю делать замену строкпоскольку это немного сложно, и я не хочу вызывать операции AppleScript или Shell для этой задачи.

Существует ли каркасная функция для достижения этой цели?Устаревание не является проблемой.

Кстати, вот решение для обратной операции .

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Решение в Obj-C и Swift как категория / расширение NSString / String.Недоступный стиль kCFURLHFSPathStyle обходится так же, как и в связанном вопросе.

Objective-C

@implementation NSString (POSIX_HFS)

    - (NSString *)POSIXPathFromHFSPath
    {
        NSString *posixPath = nil;
        CFURLRef fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)self, 1, [self hasSuffix:@":"]); // kCFURLHFSPathStyle
        if (fileURL)    {
            posixPath = [(__bridge NSURL*)fileURL path];
            CFRelease(fileURL);
        }

        return posixPath;
    }

@end

Swift

extension String {

    func posixPathFromHFSPath() -> String?
    {
        guard let fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                                          self as CFString?,
                                                          CFURLPathStyle(rawValue:1)!,
                                                          self.hasSuffix(":")) else { return nil }
        return (fileURL as URL).path
    }
}
1 голос
/ 27 марта 2019

«Обратный» режим CFURLCopyFileSystemPath() равен CFURLCreateWithFileSystemPath().Как и в упомянутых вопросах и ответах, вы создаете стиль пути из необработанного значения перечисления, поскольку CFURLPathStyle.cfurlhfsPathStyle устарела и недоступна.Пример:

let hfsPath = "Macintosh HD:Applications:Xcode.app"
if let url = CFURLCreateWithFileSystemPath(nil, hfsPath as CFString,
                                           CFURLPathStyle(rawValue: 1)!, true) as URL? {
    print(url.path) // /Applications/Xcode.app
}
...