Содержит ли атрибут файла миллисекунду?Objective-C - PullRequest
2 голосов
/ 03 марта 2012

Я хотел бы получить миллисекунды от времени создания атрибута файла Когда я получаю атрибут файла, я использую NSDateFormatter для преобразования времени создания файла (NSDate) в NSString.

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss:SS: A"];
  • сс -> секунд
  • SS -> должно быть миллисекундами
  • A -> миллисекунды даты

Я получаю 00 для СС и получаю 54487000 для А. Я заметил, что последние три цифры всегда равны нулю, поскольку NSDate происходит из атрибута файла любых файлов. Но когда я использую тот же форматер с NSDate, взятым из [NSDate date], последние три цифры не равны нулю для A, а цифра SS не всегда равна нулю.

Содержит ли атрибут файла, полученный в Objective-C, атрибут файла?

1 Ответ

3 голосов
/ 03 марта 2012

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

Системный вызов stat возвращает информацию о файле, включая несколько временных меток, в структуреназывается struct stat.Структура хранит каждую метку времени как struct timespec.struct timespec содержит поле секунд tv_sec и поле наносекунд tv_nsec.Таким образом, теоретически вы можете получить временные метки с наносекундным разрешением для своих файлов.

На практике похоже, что вы получаете только временные метки с вторым разрешением.Я протестировал этот код:

struct stat sb;
stat([NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"].UTF8String, &sb);

на моем iPhone 4S под управлением iOS 5.0.1 и получил такой результат:

(gdb) p sb
$1 = {
  st_dev = 234881033, 
  st_mode = 33188, 
  st_nlink = 1, 
  st_ino = 11265454, 
  st_uid = 501, 
  st_gid = 20, 
  st_rdev = 0, 
  st_atimespec = {
    tv_sec = 1330753666, 
    tv_nsec = 0
  }, 
  st_mtimespec = {
    tv_sec = 1330753664, 
    tv_nsec = 0
  }, 
  st_ctimespec = {
    tv_sec = 1330753664, 
    tv_nsec = 0
  }, 
  st_birthtimespec = {
    tv_sec = 1330417559, 
    tv_nsec = 0
  }, 
  st_size = 830, 
  st_blocks = 8, 
  st_blksize = 4096, 
  st_flags = 0, 
  st_gen = 0, 
  st_lspare = 0, 
  st_qspare =     {0,
    0}
}

Вы можете видеть, что все поля tv_nsecравны 0. Кажется маловероятным совпадение.

Исторически HFS Plus (собственная файловая система Mac OS X, вероятно, также используемая в iOS) сохраняла каждую временную метку в 32-разрядном целом числе без знака, представляющем количество секунд.с полуночи 1 января 1904 г. по Гринвичу.(См. Техническое примечание TN1150 .) Предположительно, в какой-то момент они расширили временные метки до 64 бит (или сделают это до 2040 года, когда 32-битные временные метки будут обернуты), но, очевидно, они не добавили никакихдробные биты.

...