如何在Mac OS X中将文件的创建时间更改为较新的日期? 在Mac OS X上,使用C和/或C++,我想把文件的创建时间更改为任意的日期/时间。我发现了许多解决方案,特别是允许将创建时间设置为较旧的日期,但这对我来说还不够-我还希望能够设置较新的日期。因此,使用utimes()
我知道设置一个更新的创建时间一定是可能的,因为苹果的开发者命令行工具中的如何在Mac OS X中将文件的创建时间更改为较新的日期? 在Mac OS X上,使用C和/或C++,我想把文件的创建时间更改为任意的日期/时间。我发现了许多解决方案,特别是允许将创建时间设置为较旧的日期,但这对我来说还不够-我还希望能够设置较新的日期。因此,使用utimes(),c++,c,macos,C++,C,Macos,我知道设置一个更新的创建时间一定是可能的,因为苹果的开发者命令行工具中的SetFile实用程序可以做到这一点,但到目前为止,我的搜索引擎未能发现任何能让我更接近解决方案的线索 有人知道我如何实现目标吗 为什么我想自己做这件事,为什么我不能使用SetFile SetFile命令行实用程序已被弃用(请参见mansetfile),因此它在将来一定会消失 我想创建一个实用程序,它允许我指定一个时间增量,以添加到当前创建时间或从当前创建时间中减去。SetFile实用程序没有任何方便的命令行参数来执行此操
SetFile
实用程序可以做到这一点,但到目前为止,我的搜索引擎未能发现任何能让我更接近解决方案的线索
有人知道我如何实现目标吗
为什么我想自己做这件事,为什么我不能使用SetFile
命令行实用程序已被弃用(请参见SetFile
),因此它在将来一定会消失mansetfile
- 我想创建一个实用程序,它允许我指定一个时间增量,以添加到当前创建时间或从当前创建时间中减去。
实用程序没有任何方便的命令行参数来执行此操作SetFile
- 最后但并非最不重要的一点:好奇心李>
- 顺便说一句,我不知道这是否安全。因此,请自行承担风险
在OSX上,您可以通过将一天的时间设置为将来,然后复制文件(并重新命名)来完成这项工作。它不是修改了创建时间的同一个文件;它是一个具有您设置的创建时间的副本
一些代码(我从中获得了设置一天时间的代码):
在Finder中:
请注意,我仅从文件的
恢复原始所有者、组和模式。我认为你不能或不想做更多,但我不知道。显然,指向该文件的链接将被破坏。尚未尝试,但根据文档,键stat
下的nsurcreationdatekey
资源值是读写的。由于您指定了C或C++,您将使用相应的<代码> CFUL< /COD> API。所以,你可以打电话:NSURL
CFURLRef url = /* ... */ CFDateRef date = /* ... */ CFErrorRef error; if (!CFURLSetResourcePropertyForKey(url, kCFURLCreationDateKey, date, &error)) /* handle error */;
编辑:一个简单的例子const char* fileName = "/path/to/file"; size_t fileNameStringLength = strlen(fileName); Boolean isDirectory = false; CFURLRef url = CFURLCreateFromFileSystemRepresentation( kCFAllocatorDefault, (const UInt8*)fileName, fileNameStringLength, isDirectory); // Seconds since 1 January, 2001 00:00:00 GMT CFAbsoluteTime absTime = CFAbsoluteTimeGetCurrent(); CFAbsoluteTime adjustedCreationTime = absTime - 3600; CFDateRef date = CFDateCreate( kCFAllocatorDefault, adjustedCreationTime); CFErrorRef error; if (!CFURLSetResourcePropertyForKey(url, kCFURLCreationDateKey, date, &error)) { fprintf(stderr, "an error occurred\n"); exit(1); } CFRelease(url); CFRelease(date);
无论如何,使用不会起作用,因为您只能使用它设置访问和修改时间,而不能设置创建时间。要更改创建时间,唯一的方法是创建一个新文件,复制内容,然后将其重命名为新文件。那么创建时间将是“现在”。一旦设置了创建时间,您就不能在用户空间中更改它。@JoachimPileborg如果您阅读了我引用的答案,您将看到
在某些情况下会调整创建时间。指向指定行为的utimes()
的BSD手册页。我承认我自己没有测试过这种行为,但是如果您在命令行上运行utimes()
,并设置一个比文件当前创建时间早的修改时间,它的操作就很明显了。大多数Unix文件系统甚至不存储创建时间。我用一个最小的示例测试了它,它确实有效!只是把例子放在一起一直是个麻烦,因为我不熟悉核心基金会。同时,我发现了一个同样有效的替代方案,它使用Objective-C/Cocoa()。我会选择这个解决方案,因为C/C++可以很容易地与Objective-C混合使用,而使用Cocoa的高级API,生活会轻松得多。感谢您花时间将其整合在一起。幽默很受欢迎:-)但正如你自己所注意到的,这个解决方案并不理想。谢谢你提出这个问题。这是我40天中最有趣的一次,所以:-)让我想起了高中时写的一个程序,将所有系统字体缩减为1,使鼠标几乎无法控制任何东西(gag应用程序)。经常频繁地更改系统时间。。。那可能更糟日历、日志文件、电子邮件、到期日期、续约提示,噢,天哪!touch-t
CFURLRef url = /* ... */ CFDateRef date = /* ... */ CFErrorRef error; if (!CFURLSetResourcePropertyForKey(url, kCFURLCreationDateKey, date, &error)) /* handle error */;
const char* fileName = "/path/to/file"; size_t fileNameStringLength = strlen(fileName); Boolean isDirectory = false; CFURLRef url = CFURLCreateFromFileSystemRepresentation( kCFAllocatorDefault, (const UInt8*)fileName, fileNameStringLength, isDirectory); // Seconds since 1 January, 2001 00:00:00 GMT CFAbsoluteTime absTime = CFAbsoluteTimeGetCurrent(); CFAbsoluteTime adjustedCreationTime = absTime - 3600; CFDateRef date = CFDateCreate( kCFAllocatorDefault, adjustedCreationTime); CFErrorRef error; if (!CFURLSetResourcePropertyForKey(url, kCFURLCreationDateKey, date, &error)) { fprintf(stderr, "an error occurred\n"); exit(1); } CFRelease(url); CFRelease(date);