cocoa - Cocoa 和 CoreFoundation 返回的文件属性有什么区别?

标签 cocoa filesystems macos-carbon

在Cocoa中,可以通过如下方式获取文件的属性

NSString *path = @"/path/to/some/file";
NSError *err = ......;
NSDictionary *dic = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&err];
NSLog(@"%@", dic);

例如,它将返回一个 key 目录

{
    NSFileCreationDate = "2009-12-02 10:03:38 +0000";
    NSFileExtensionHidden = 0;
    NSFileGroupOwnerAccountID = 80;
    NSFileGroupOwnerAccountName = admin;
    NSFileHFSCreatorCode = 0;
    NSFileHFSTypeCode = 0;
    NSFileModificationDate = "2009-12-02 19:20:54 +0000";
    NSFileOwnerAccountID = 501;
    NSFileOwnerAccountName = Tony;
    NSFilePosixPermissions = 511;
    NSFileReferenceCount = 1;
    NSFileSize = 496988;
    NSFileSystemFileNumber = 5187496;
    NSFileSystemNumber = 234881029;
    NSFileType = NSFileTypeRegular;
}

现在,您还可以使用CoreFoundation MDItem来获取文件属性

NSString *path = @"/path/to/some/file";
MDItemRef mdItem = MDItemCreate(kCFAllocatorDefault, (__bridge CFStringRef)path);
CFArrayRef arr = MDItemCopyAttributeNames(mdItem);
CFDictionaryRef dic = MDItemCopyAttributes(mdItem, arr);
NSLog(@"%@", dic);

它会返回类似这样的内容

{
    kMDItemAuthors =     (
        "Some One"
    );
    kMDItemContentCreationDate = "2009-12-02 10:03:38 +0000";
    kMDItemContentModificationDate = "2009-12-02 19:20:54 +0000";
    kMDItemContentType = "org.openxmlformats.presentationml.presentation";
    kMDItemContentTypeTree =     (
        "org.openxmlformats.presentationml.presentation",
        "org.openxmlformats.openxml",
        "public.zip-archive",
        "com.pkware.zip-archive",
        "public.data",
        "public.item",
        "com.apple.bom-archive",
        "public.archive",
        "public.presentation",
        "public.composite-content",
        "public.content"
    );
    kMDItemDateAdded = "2011-08-16 07:52:53 +0000";
    kMDItemDisplayName = "Some File.pptx";
    kMDItemFSContentChangeDate = "2009-12-02 19:20:54 +0000";
    kMDItemFSCreationDate = "2009-12-02 10:03:38 +0000";
    kMDItemFSCreatorCode = 0;
    kMDItemFSFinderFlags = 0;
    kMDItemFSHasCustomIcon = 0;
    kMDItemFSInvisible = 0;
    kMDItemFSIsExtensionHidden = 0;
    kMDItemFSIsStationery = 0;
    kMDItemFSLabel = 0;
    kMDItemFSName = "Some File.pptx";
    kMDItemFSNodeCount = 496988;
    kMDItemFSOwnerGroupID = 80;
    kMDItemFSOwnerUserID = 501;
    kMDItemFSSize = 496988;
    kMDItemFSTypeCode = 0;
    kMDItemKind = "Microsoft PowerPoint presentation";
    kMDItemLogicalSize = 496988;
    kMDItemPhysicalSize = 499712;
    kMDItemTitle = "PowerPoint Presentation";
}

我的问题是,这两种查找文件属性的方法有什么区别?似乎有些等价,但并非总是等价,哪个更好?为什么会有这两种方式?

最佳答案

从 NSFileManager 返回的属性是存储在文件系统中的文件上的属性。 MDItemCopyAttributes 的结果来自 Spotlight 索引,其中包括大多数(全部?)文件系统属性以及系统上安装的任何 Spotlight 插件的结果。

关于cocoa - Cocoa 和 CoreFoundation 返回的文件属性有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632831/

相关文章:

ios - 从 subview 中引用包含 UIView 的内容?

java - 执行 native 代码的线程的正常关闭

c++ - 解析 CFMutableDictionary 键

objective-c - 要成为 NSDictionary 的键,类必须也实现 isEqual : and hash?

cocoa - Lion 中的 NSScrollView 背景图像

python - 为什么 os.umask() 的参数是倒置的? (umask 0o000 使 chmod 0o777)

ios - 无需越狱即可访问 iOS 文件系统?

c# - 如何在访问文件夹时收到通知?

objective-c - 以编程方式跟踪 Mac 上事件应用程序的最佳方法是什么

macos - 雪豹上的 NSImage 颜色偏移