【问题标题】:API to set file timestamps in OS X在 OS X 中设置文件时间戳的 API
【发布时间】:2013-04-24 04:43:33
【问题描述】:

我想(双向)在 PC(Win7、NTFS)和 Mac(OS X、HFS+)之间同步文件。我尝试使用很多现有的工具/方法(Unison、SyncToy 或其他在 Samba 共享上工作的软件等),但它们都无法在我的文件上保留文件创建时间戳(因此称为 FCT),这对我来说是不可接受的。

Unison 不理解 FCT 的概念,可能是因为它主要是基于 Unix 构建的(参见 my Unison forum post

在访问由 OS X 提供服务的 SMB 共享时,Windows 无法获取(或设置)FCT。在这种情况下,它会显示和设置文件修改时间来代替 FCT(这里应该归咎于 Samba,而不是 Windows),所以SyncToy 之类的东西不能使用。

另一方面,OS X 在使用 Windows 服务的 SMB 共享时可以获取和设置 FCT。这是一个很好的发现,因为我认为我可以编写一个在 OS X 上运行的 Python 程序,在本地文件和 SMB 共享之间进行文件同步,使用 cp 复制文件。当我发现 cp -p 选项没有保留 FCT 时,这也被证明是不可行的。只有在通过 Finder GUI 复制文件时才会保留 FCT。

所以我决定自己编写一个文件同步实用程序,可能使用 Python,它的一个实例将分别在 PC 和 Mac 上运行,通过 ssh 进行通信。由于 Python 本身没有可靠的方法来获取或设置 FCT,因此我决定为 Python 为此目的与之通信的每个平台构建一个本机帮助应用程序。 (要么用 C 编写 Python 模块,但我相信这样做会更复杂)

这让我想到了一个问题 - 在 OS X 中设置文件时间戳的 API 是什么?

我正在寻找构建一个控制台应用程序,我的 Python 脚本可以通过 STDIN 和 STDOUT 与之通信。基本上我正在寻找GetFileTimeSetFileTime的OS X等价物

我可以在 C 中做的事情会很棒,因为我没有使用 Objective C 开发的经验。

【问题讨论】:

    标签: macos cocoa synchronization rsync filetime


    【解决方案1】:

    更改文件属性的 Cocoa 方法是使用 NSFileManager:

    NSError* error = nil;
    NSString* filePath = [@"~/Desktop/test.txt" stringByExpandingTildeInPath];
    if(![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate : [NSDate date]} ofItemAtPath:filePath error:&error])
    {
        NSLog(@"Setting file creation date attribute failed with error:%@", error);
    }
    

    您可以在 Foundation 命令行实用程序中使用上述代码。

    如果您更喜欢纯 C,您可以使用 POSIX stat 代替: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/stat.2.html

    【讨论】:

    • 你知道一个简单的 C 方法来设置文件创建时间吗?我看到 here 可以在 BSD 上使用两个 utimes() 调用,但是 apple's version 没有谈论它。
    • 我用这个答案破解了一个小型命令行实用程序birthtime_touch
    • @PuneetArora This SO answer 有一个使用核心基础函数CFURLSetResourcePropertyForKey 的纯 C 解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2013-12-17
    • 2012-12-06
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多