Получение kMDItemKind для файлов внутри пакетов возвращает ноль

По какой-то причине я не могу сделать это для файлов внутри пакетов и файлов, находящихся на разных томах.

Единственно ли у меня возникла эта проблема, и если нет, то как ее решить?

У Finder, похоже, нет проблем с отображением свойств прожектора для тех же файлов, с которыми у меня возникли проблемы.

Я хочу получить kMDItemKind файлов, а также некоторые другие свойства.

CFStringRef path = CFSTR("/Applications/Chess.app/Contents/Info.plist"); // bad
// CFStringRef path = CFSTR("/Applications/Chess.app");                  // good

MDItemRef item = MDItemCreate(kCFAllocatorDefault, (CFStringRef)path);
if(!item) {
 NSLog(@"MDItemCreate returned NULL for path: %@", path);
 return nil;
}

CFStringRef kind = MDItemCopyAttribute( item, kMDItemKind );
if(kind) {
 NSLog(@"file: %@  kind: %@", path, (NSString*)kind);
 CFRelease( kind );                            
} else {
 NSLog(@"file: %@  has no kMDItemKind attribute", path);
}
CFRelease( item );

ВЫВОД:

файл: /Applications/Chess.app/Contents/Info.plist не имеет атрибута kMDItemKind

Та же проблема, если я использую инструмент командной строки mdls, например

prompt> mdls /Applications/Chess.app/Contents/Info.plist
kMDItemFSContentChangeDate = 2009-05-19 08:09:03 +0200
kMDItemFSCreationDate      = 2009-05-19 08:09:03 +0200
kMDItemFSCreatorCode       = ""
kMDItemFSFinderFlags       = 0
kMDItemFSHasCustomIcon     = 0
kMDItemFSInvisible         = 0
kMDItemFSIsExtensionHidden = 0
kMDItemFSIsStationery      = 0
kMDItemFSLabel             = 0
kMDItemFSName              = "Info.plist"
kMDItemFSNodeCount         = 0
kMDItemFSOwnerGroupID      = 0
kMDItemFSOwnerUserID       = 0
kMDItemFSSize              = 3294
kMDItemFSTypeCode          = ""

Как видите, возвращается очень мало данных и нет kMDItemKind.

Как получить метаданные Info.plist?


person neoneye    schedule 18.08.2010    source источник


Ответы (1)


Получить kMDItemKind для файлов внутри пакетов возвращает ноль

Правильный. Вы не можете получить свойства метаданных для файлов, которые метаданные не проиндексировали, и он не индексирует файлы внутри пакетов, в определенных папках и на любом томе, где индексирование отключено (включая, помимо прочего, тома только для чтения). , где метаданные не могут записать индекс на том).

У Finder, похоже, нет проблем с отображением свойств прожектора для тех же файлов, с которыми у меня возникли проблемы.

Как вы это тестируете? Я получил информацию о файле PNG и о файле PNG внутри пакета приложений; у первого были обычные свойства изображения (например, размеры), но тот, что внутри пакета, ничего не показывал.

Если вам нужен только вид, используйте функция LSCopyKindStringForURL. Как и большинство функций Core Services, он следует правилам управления памятью CF< /а>.

person Peter Hosey    schedule 19.08.2010
comment
Имеет смысл. LSCopyKindStringForURL - это именно то, что я ищу, я был на неправильном пути. Опять у вас есть решение моих сложных проблем. Спасибо. - person neoneye; 19.08.2010