检查路径是否是ObjC中的文件夹/包/别名

时间:2010-02-12 20:01:46

标签: objective-c directory package alias bundle

我来自AppleScript的土地,我们使用

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

查看路径是否是上述任一路径。但我似乎无法找到如何在ObjC / Cocoa中做到这一点。我很确定这很容易,但我找不到任何关于它的信息。

...谢谢

6 个答案:

答案 0 :(得分:3)

通常您使用NSFileManagerNSWorkspace

要查看路径是否是文件夹/目录,请使用NSFileManager的{​​{1}}。

要查看路径是否为包,请使用-fileExistsAtPath:isDirectory:的{​​{1}}。

我不知道任何本机Cocoa方法来检查路径是否是别名(这是OS X之前的概念......)。 我总是使用Nathan Day的Alias的Cocoa包装,NDAlias。请参阅NSWorkspace类别中的isFilePackageAtPath:。 要使用它,请执行

finderInfoFlags:type:creator:

它看起来不必要地复杂,但这就是生活。 Alias属于Classic Mac OS技术,而Cocoa属于NeXTStep传统。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

从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;
}

(雅虎的解决方案在OS X 10.8中已弃用)

答案 3 :(得分:1)

有一个资源值键NSURLIsAliasFileKey可在macOS 10.6+上使用

NSNumber * number = nil;
[fileUrl getResourceValue:&number forKey:NSURLIsAliasFileKey error:nil];
BOOL isAlias = [number boolValue];

答案 4 :(得分:0)

我检查NSURL的方法是别名(适用于我):

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

答案 5 :(得分:0)

我一直在寻找使用Swift 3.0检测别名和符号链接的解决方案,并找到了回复In core Foundation

因此,您可以创建网址扩展

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
    }

}