2

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

Unison 不理解 FCT 的概念,可能是因为它主要是基于 Unix 构建的(请参阅我的 Unison 论坛帖子

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

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

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

这让我不禁要问——在 OS X 中设置文件时间戳的 API 是什么?

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

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

4

1 回答 1

3

更改文件属性的 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

于 2013-04-30T14:42:13.590 回答