Как программно получить дату "последнего открытия", как показано в Finder

Я хочу, чтобы в моем приложении отображалась дата "последнего открытия", как в окне предварительного просмотра или информационной панели Finder. Однако я понял, что это НЕ совпадает с последней датой доступа, которую я получу с

NSDate* lastAccessDate = [fileUrl resourceValuesForKeys:@[NSURLContentAccessDateKey] error:NULL][NSURLContentAccessDateKey];

или с

struct stat buf;
stat(curName, &buf);
time_t lastAccessDate = buf.st_atimespec.tv_sec;

Они возвращают время последнего доступа Unix, которое также отображается в терминале для ls -lОднако в Finder отображается другое значение, которое изменяется только при открытии файла пользователем (например, двойным щелчком).


Я читаю посты "Получить настоящую дату" последнего открытия "?" и "Дата последнего открытия", но это не помогло. Они рекомендуют что-то вроде

MDItemRef itemRef = MDItemCreateWithURL(NULL, (__bridge CFURLRef)fileUrl);
NSArray *attributeNames = (__bridge NSArray *)MDItemCopyAttributeNames(itemRef);
NSDictionary *attributes = (__bridge NSDictionary *) MDItemCopyAttributes(itemRef, (__bridge CFArrayRef) attributeNames);
CFDateRef lastUsedCfDate = MDItemCopyAttribute(itemRef, kMDItemLastUsedDate);
NSDate* lastUsedDate = (__bridge NSDate*) lastUsedCfDate;
CFRelease(itemRef);

Но attributeNames не имеет значения kMDItemLastUsedDate, В моем случае в этом массиве ровно 24 значения, но ни одно из них не используется в последний раз. Так lastUsedDate является nil...

Также мне интересно, нет ли действительно API высокого уровня для доступа к последней открытой дате.

2 ответа

Я столкнулся с той же проблемой. Я обнаружил, что когда Finder встречает случай, когда kMDItemLastUsedDate ключ недоступен, он покажет вам значение для kMDItemFSContentChangeDate ключ вместо

http://forums.macrumors.com/showthread.php?t=855913

Цитировать chown33:

Расширенные атрибуты полностью отличаются от метаданных. Xattrs прикрепляются к файлу, хранящемуся как часть файловой системы. Метаданные извлекаются из файла, хранящегося в хранилище метаданных (по сути, в базе данных Spotlight). Некоторые xattrs извлекаются и хранятся в хранилище метаданных, но они по-прежнему две разные вещи.

Команды, работающие с метаданными, соответствуют шаблону глобализации md *: mdfind, mdls, mdutil и т. Д.

...

Обычно вы не можете обновить ни одно из значений метаданных. Это сделано из того, что я вижу, глядя на низкоуровневый API.

Другие вопросы по тегам