2010-02-12 99 views
2

我來自AppleScript的土地,在那裏,我們使用檢查路徑是ObjC

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

,看是否有路徑或者以上的文件夾/包/別名。但我似乎無法找到如何在ObjC /可可中做到這一點。我很確定這很容易,但我沒有找到任何有關它的信息。

謝謝...

回答

3

通常您使用NSFileManagerNSWorkspace

要查看路徑是否是文件夾/目錄,請使用NSFileManager-fileExistsAtPath:isDirectory:

要查看路徑是否爲包,請使用NSWorkspaceisFilePackageAtPath:

我不知道任何本地的可可方式來檢查路徑是別名(這是一個OS X之前的概念...)。 我總是使用Nathan Day的可可包裝Alias,NDAlias。在他的NSString類別中查看finderInfoFlags:type:creator:。 要使用它,做

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遺產。

+0

謝謝。 我發現我需要使用finderInfoFlags:kIsAlias類型:0創建者:0但我不知道如何給它一個路徑... – Jef 2010-02-13 08:41:59

+0

感謝堆人!注意:在您的代碼中,您使用getFinderInfo並且它不存在。你必須使用finderInfoFlags,就像你說的更高一些。 – Jef 2010-02-14 10:00:32

+0

你是完全正確的。愚蠢的我。固定。 – Yuji 2010-02-14 12:08:15

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

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)

0

我的檢查方法NSURL是別名(適用於我):

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

祝你好運!

0

我一直在尋找一個解決方案來檢測使用雨燕3.0別名和符號鏈接,發現響應In core Foundation

所以,你可以創建一個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 
    } 

}