Cocoaで、シンボリックリンクの更新日を設定したいです。
を使用する[NSFileManager setAttributes:ofItemAtPath:error:]
と、通常のファイルではうまく機能しますが、シンボリック リンクでは機能しません。
どうすればそれを達成できますか?
Cocoaで、シンボリックリンクの更新日を設定したいです。
を使用する[NSFileManager setAttributes:ofItemAtPath:error:]
と、通常のファイルではうまく機能しますが、シンボリック リンクでは機能しません。
どうすればそれを達成できますか?
NSFileManager で直接行う方法はありません。setAttributes:ofItemAtPath:error: メソッドは、utimes、setxattr、chown などの一連の BSD パスベースの関数をラップします。これらはすべて、シンボリック リンクを直接操作するのではなく、シンボリック リンクをたどります。
明らかな代替手段の 1 つは、手動で BSD レイヤーにドロップダウンすることです。一部の関数には、lchown のように「シンボリック リンクをたどらない」バージョンがありますが、すべてがそうであるわけではありません。特に、mod 時間を変更する utimes は変更しません。そのため、ファイルを開いて、fd ベースの亜種である futimes を使用する必要があります。コードは次のようになります。
int fd = open([NSFileManager fileSystemRepresentationWithPath:path], O_RDONLY | O_SYMLINK);
futimes(fd, 0);
close(fd);
これをたくさん行う予定がある場合は、独自の setAttributes:ofSymlinkAtPath:error: 実装を NSFileManager のカテゴリに記述して、futimes、fchflags、fsetxattr などをまとめることができます。
これに関する唯一の実際の問題は、これが機能するためにシンボリックリンク自体への読み取りアクセス権 (および mod 時刻などを変更するために必要なアクセス権) が必要なことですが、通常は問題ありません。とにかく、OS Xはそれを回避する方法がないことを私は知っています。(Linux では、f* 呼び出しを実行するためだけに、読み取りアクセスでも書き込みアクセスでもないファイルを開くことができますが、BSD ではできません。)
別の方法として、NSURL ファイルの URL API はシンボリック リンクをたどらないと考えています。つまり、これは機能するはずです (ただし、今は Mac の前にいないため、テストできません)。
[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil];