Проверьте, является ли путь папкой / bundle / alias в ObjC - PullRequest
2 голосов
/ 12 февраля 2010

Я пришел из земли AppleScript и там мы используем

alias of (info for thePath)
package folder of (info for thePath)
folder of (info for thePath)

чтобы увидеть, является ли путь одним из вышеперечисленных. Но я не могу понять, как это сделать в ObjC / Cocoa. Я уверен, что это довольно легко, но я не могу найти информацию об этом.

Спасибо ...

Ответы [ 6 ]

3 голосов
/ 29 июля 2013

Начиная с OS X 10.6, вы можете сделать следующее, чтобы определить, является ли файл псевдонимом:

- (BOOL) fileIsAlias: (NSString*) thePath {
    NSURL* url = [NSURL fileURLWithPath:thePath];
    CFURLRef cfurl = (__bridge CFURLRef) url;
    CFBooleanRef cfisAlias = kCFBooleanFalse;
    BOOL success = CFURLCopyResourcePropertyForKey(cfurl, kCFURLIsAliasFileKey, &cfisAlias, NULL);

    BOOL isAlias = CFBooleanGetValue(cfisAlias);
    return isAlias && success;
}

(Решение от Yahoo устарело в OS X 10.8)

3 голосов
/ 07 марта 2010
NSString *path;
BOOL isAliasFile=NO;  
FSRef fsRef;
FSPathMakeRef((const UInt8 *)[path fileSystemRepresentation], &fsRef, NULL);
Boolean isAliasFileBoolean, isFolder;
FSIsAliasFile (&fsRef, &isAliasFileBoolean, &isFolder);
if(isAliasFileBoolean)
    isAliasFile=YES;
NSLog([NSString stringWithFormat:@"%d %@",isAliasFile,path]);

Самый быстрый, который я нашел. Вы можете использовать его, чтобы проверить, является ли это папкой - проверьте ссылку FSIsAliasFile .

3 голосов
/ 13 февраля 2010

Обычно вы используете NSFileManager или NSWorkspace .

Чтобы узнать, является ли путь папкой / каталогом, используйте NSFileManager 's -fileExistsAtPath:isDirectory:.

Чтобы узнать, является ли путь пакетом, используйте NSWorkspace s isFilePackageAtPath:.

Я не знаю какого-либо собственного способа Какао, чтобы проверить, является ли путь псевдонимом (это концепция до OS X ...). Я всегда использую обертку Какао Натана Дея для Alias, NDAlias ​​. См. finderInfoFlags:type:creator: в его категории NSString. Чтобы использовать это, сделайте

UInt16 flags;
OSType type;
OSType creator;
if([@"/path/to/file" finderInfoFlags:&flags type:&type creator:&creator]){
    if(flags&kIsAlias){
         the file is an alias...
    }
}else{
   some error occurred... 
}

Ну, это выглядит излишне сложно, но это жизнь. Псевдоним относится к технологии Classic Mac OS, а Cocoa - к наследию NeXTStep.

1 голос
/ 08 сентября 2018

Существует ключ значения ресурса NSURLIsAliasFileKey, который вы можете использовать в macOS 10.6 +

NSNumber * number = nil;
[fileUrl getResourceValue:&number forKey:NSURLIsAliasFileKey error:nil];
BOOL isAlias = [number boolValue];
0 голосов
/ 14 ноября 2016

Я искал решение для обнаружения псевдонимов и символических ссылок с помощью Swift 3.0 и нашел ответ В базовом фундаменте

Таким образом, вы можете создать расширение URL

extension URL{

    var isAnAlias:Bool{
        // Alias? https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/URL.swift#L417
        let resv:URLResourceValues? = try? self.resourceValues(forKeys: [URLResourceKey.isAliasFileKey])
        return resv?.isAliasFile ?? false
    }

}
0 голосов
/ 04 ноября 2014

Мой способ проверить NSURL - псевдоним (работает для меня):

// url - is alias?
NSData * bookmarkData = [NSURL bookmarkDataWithContentsOfURL:url error:nil];
BOOL isAlias = (bookmarkData) ? YES : NO;

Удачи!

...