Установка NSFileCreationDate не имеет никакого эффекта - PullRequest
6 голосов
/ 02 августа 2011

Я пытаюсь установить даты создания и изменения файла.

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. Базовый SDK проекта Xcode - 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 ]

9 голосов
/ 02 августа 2011

Поработав с простым примером еще немного, я заметил, что он работает только для файлов, которые я недавно изменил.

Мне удалось получить простой пример, а также исходный код, о котором я спрашивал, для последовательной работы, установив дату модификации до установки даты создания.

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];
0 голосов
/ 02 августа 2011

Какая версия OS X?Где находится целевой файл?Каков формат диска тома, на котором находится файл?Какие настройки у вас есть на вашем Mac (у вас есть программный RAID случайно)?

Тест здесь в Mac OS X 10.7 с файлом на моем рабочем столе, и HFS + работает отлично (обадаты меняются на now).

У меня были некоторые странные результаты в прошлом с некоторыми из более новых NSFileManager API.Например, -copyItemAtPath:toPath:error: не сохраняет дату создания файла при копировании файлов на томах HFS +.В частности, дата создания очищается в копии, которая приравнивается к дате в 1904 году.

Зная больше о ваших настройках, вы можете определить причину.

...