3

ファイル属性の作成時刻からミリ秒を取得したいファイル属性を取得するときに、NSDateFormatterを使用してファイル作成時刻(NSDate)をNSStringに変換します。

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss:SS: A"];
  • ss->秒
  • SS->ミリ秒である必要があります
  • A->日付のミリ秒

SSの場合は00を取得し、Aの場合は54487000を取得します。NSDateの最後の3桁は常にゼロであり、任意のファイルのファイル属性から取得されます。しかし、[NSDate date]からのNSDateで同じフォーマッタを使用すると、Aの最後の3桁はゼロではなく、SS桁は常にゼロであるとは限りません。

Objective-Cで取得したファイル属性にファイル属性が含まれていますか?

4

1 に答える 1

4

これは、使用しているオペレーティング システムと、ファイルが存在するファイル システムの種類によって異なります。iOS を使用していると仮定します (この場合、iOS がたまたま使用するファイルシステムを使用しています)。

システム コールは、statいくつかのタイムスタンプを含むファイルに関する情報を という構造体で返しますstruct stat。この構造体は、各タイムスタンプを として格納しstruct timespecます。にstruct timespecは、秒フィールドtv_secとナノ秒フィールドが含まれていますtv_nsec。したがって、理論的には、ファイルのタイムスタンプをナノ秒単位で取得できます。

実際には、2 番目の解像度のタイムスタンプしか取得できないようです。私はこのコードでテストしました:

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

iOS 5.0.1 を実行している iPhone 4S では、次の結果が得られました。

(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}
}

すべてのフィールドが 0 であることがわかりますtv_nsec。これは偶然ではないようです。

歴史的に、HFS Plus (Mac OS X ネイティブ ファイルシステム、おそらく iOS でも使用されている) は、各タイムスタンプを 1904 年 1 月 1 日 GMT の午前 0 時からの秒数を表す 32 ビットの符号なし整数に格納していました。(テクニカル ノート TN1150を参照してください。) おそらくある時点でタイムスタンプを 64 ビットに拡張しました (または、32 ビットのタイムスタンプが循環する 2040 年より前に拡張する予定です) が、小数ビットを追加しなかったようです。

于 2012-03-03T05:56:01.583 に答える