2013-04-30 52 views
3

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

齐奏不明白的FCT的概念,也许是因为它与Unix的考虑主要是建立在访问由OS X.服务SMB共享时(见my Unison forum post

Windows无法获得(或设置)中的FCT在这种情况下,它会显示并设置文件修改时间来代替FCT(Samba将在此处受到责备,而不是Windows),因此不能使用类似SyncToy的内容。

另一方面,OS X在使用Windows提供的SMB共享时可以获取和设置FCT。这是一个很好的发现,因为我认为我可以编写一个可以在OS X上运行的Python程序,使用cp复制文件来执行本地文件与SMB共享之间的文件同步。当我发现FCTs没有被cp -p选项保存时,这也变成了一个禁忌。仅在通过Finder GUI复制文件时保留了FCT。

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

这使我想到了 - 什么是在OS X中设置文件时间戳的API?

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

东西我可以用C做的是伟大的,因为我没有经验的目的C.

回答

2

发展的可可方法来改变文件属性会使用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); 
} 

你可以在一个基础命令行实用程序使用上面的代码。

如果你喜欢纯C,你可以使用POSIX的统计,而不是: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/stat.2.html

+1

你任何机会知道一个普通的C方法** **设置文件创建时间? [see here](http://www.gsp.com/cgi-bin/man.cgi?section=2&topic=utimes)可能在BSD上使用两次utimes()调用,但[apple's version](https: //developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/utimes.2.html#//apple_ref/doc/man/2/utimes)不会谈论它。 – 0cd 2013-05-01 07:56:49

+0

我用这个答案一起砍了一个小的cmdline实用程序[birthtime_touch](https://github.com/herzbube/birthtime_touch)。 – herzbube 2016-08-15 23:24:54

+0

@PuneetArora [This SO answer](http://stackoverflow.com/a/38885787/1054378)有一个简单的C解决方案,它使用Core Foundation函数'CFURLSetResourcePropertyForKey'。 – herzbube 2016-08-15 23:26:12