设置NSFileCreationDate无效

时间:2011-08-01 23:05:15

标签: objective-c cocoa macos nsfilemanager

我正在尝试在文件上设置创建和修改日期。

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDate *now = [NSDate date];
NSDictionary *timestampAttr = [NSDictionary dictionaryWithObjectsAndKeys:
                                      now, NSFileCreationDate, now, NSFileModificationDate, nil];
BOOL ret = [fileManager setAttributes:timestampAttr ofItemAtPath:path error:&err];

已成功修改文件的修改日期。创建日期不变。为什么?

ret为真,err为零。 -attributesOfItemAtPath返回一个字典,其中包含timestampAttr中的键和正确(修改)的修改日期以及不正确(未修改)的创建日期。

编辑:使用OS X版本10.6。 Xcode项目的基础SDK是10.5。文件位于我的计算机上唯一的硬盘驱动器(无RAID),位于我的主文件夹内的文件夹中。 如果文件有所不同,该文件位于应用程序包内。

编辑:这个简单示例有效:

#import <Cocoa/Cocoa.h>

int main(void)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSFileManager *m = [NSFileManager defaultManager];
    NSString *path = ...;
    [m setAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[NSDate date],NSFileCreationDate,nil] ofItemAtPath:path error:nil];
    [pool drain];
    return 0;
}

我将上面的代码粘贴到我最初询问的应用程序中,设置与简单示例相同的文件的属性(在我的桌面上)。当代码在应用程序内部时,它不起作用。

编辑:好的,这很疯狂。上面的简单示例正在工作(我的同事和我都看到它在我的计算机上工作)但现在它不起作用。

2 个答案:

答案 0 :(得分:9)

在玩了一些简单的例子之后,我注意到它只适用于我最近修改过的文件。

我能够通过在设置创建日期之前设置修改日期来获得简单的示例,以及我要求的原始代码。

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDate *now = [NSDate date];
NSDictionary *creationDateAttr = [NSDictionary dictionaryWithObjectsAndKeys: now, NSFileCreationDate, nil];
NSDictionary *modificationDateAttr = [NSDictionary dictionaryWithObjectsAndKeys: now, NSFileModificationDate, nil];
[fileManager setAttributes:modificationDateAttr ofItemAtPath:path error:&err];
[fileManager setAttributes:creationDateAttr ofItemAtPath:path error:&err];

答案 1 :(得分:0)

什么版本的OS X?目标文件位于何处?文件所在卷的磁盘格式是什么?你在Mac上有什么样的设置(你有没有软件RAID)?

在我的桌面上使用文件在Mac OS X 10.7中进行测试,HFS +工作正常(两个日期都更改为now)。

过去我在一些较新的NSFileManager API中遇到了一些奇怪的结果。例如,在HFS +卷上复制文件时,-copyItemAtPath:toPath:error:不会保留文件创建日期。具体而言,创建日期在副本中清除,这相当于1904年的日期。

了解有关您的设置的更多信息可能有助于查明原因。