Содержит ли атрибут файла миллисекунды? Цель-C

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

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

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

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


person BB.    schedule 03.03.2012    source источник
comment
Зачем нужна эта точность? Просто спрашиваю.   -  person Richard J. Ross III    schedule 03.03.2012
comment
Например, чтобы увидеть, какой из нескольких файлов, которые были изменены в течение одной секунды, был изменен последним (например, для создания N-1 файлов на основе содержимого N-го файла)   -  person Alexander Pavlov    schedule 05.06.2013


Ответы (1)


Это может зависеть от того, в какой операционной системе вы работаете, и в какой файловой системе находится файл. Я предполагаю, что вы используете 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-битные временные метки будут свернуты), но, по-видимому, они не добавили дробные биты.

person rob mayoff    schedule 03.03.2012