Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Mac OS X中将文件的创建时间更改为较新的日期? 在Mac OS X上,使用C和/或C++,我想把文件的创建时间更改为任意的日期/时间。我发现了许多解决方案,特别是允许将创建时间设置为较旧的日期,但这对我来说还不够-我还希望能够设置较新的日期。因此,使用utimes()_C++_C_Macos - Fatal编程技术网

如何在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
      下的
      NSURL
      资源值是读写的。由于您指定了C或C++,您将使用相应的<代码> CFUL< /COD> API。所以,你可以打电话:

      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()
      在某些情况下会调整创建时间。指向指定行为的
      utimes()
      的BSD手册页。我承认我自己没有测试过这种行为,但是如果您在命令行上运行
      touch-t
      ,并设置一个比文件当前创建时间早的修改时间,它的操作就很明显了。大多数Unix文件系统甚至不存储创建时间。我用一个最小的示例测试了它,它确实有效!只是把例子放在一起一直是个麻烦,因为我不熟悉核心基金会。同时,我发现了一个同样有效的替代方案,它使用Objective-C/Cocoa()。我会选择这个解决方案,因为C/C++可以很容易地与Objective-C混合使用,而使用Cocoa的高级API,生活会轻松得多。感谢您花时间将其整合在一起。幽默很受欢迎:-)但正如你自己所注意到的,这个解决方案并不理想。谢谢你提出这个问题。这是我40天中最有趣的一次,所以:-)让我想起了高中时写的一个程序,将所有系统字体缩减为1,使鼠标几乎无法控制任何东西(gag应用程序)。经常频繁地更改系统时间。。。那可能更糟日历、日志文件、电子邮件、到期日期、续约提示,噢,天哪!
      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);