2013-04-30 55 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