Как программно получить дату "последнего открытия", как показано в 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.