2012-05-15 49 views

回答

6

有沒有辦法直接與NSFileManager做到這一點。 setAttributes:ofItemAtPath:error:方法包裝了一系列基於BSD路徑的函數,如utimes,setxattr,chown等,它們都遵循符號鏈接,而不是直接對它們進行操作。

一個明顯的選擇是手動下拉到BSD層。一些函數具有「不遵循符號鏈接」的版本,比如lchown,但並不是所有的都有。特別是,改變mod時間的那個,不是。所以你必須打開文件並使用基於fd的變體futimes。下面的代碼是什麼樣子:

int fd = open([NSFileManager fileSystemRepresentationWithPath:path], O_RDONLY | O_SYMLINK); 
futimes(fd, 0); 
close(fd); 

如果你打算做了很多這方面,你可以寫自己的setAttributes:ofSymlinkAtPath:錯誤:實施上的NSFileManager一個類別,它包裝起來futimes,fchflags,fsetxattr等

唯一真正的問題是,你需要有讀取權限的符號鏈接本身(以及任何訪問你需要修改MOD時間等),這個工作,但通常不是問題,就我所知,無論如何,OS X都無法解決問題。 (Linux確實讓你打開一個文件既不讀也不寫訪問,只是做f *調用,但BSD不行)

作爲另一種替代方法,我相信NSURL文件URL APIs不會遵循符號鏈接,這意味着這應該工作(但我現在不在我的Mac前面,所以我不能測試):

[[NSURL fileURLWithPath:path isDirectory:NO] setResourceValue:[NSDate date] forKey:NSURLContentModificationDateKey error:nil]; 
+0

感謝您的完整答案。不幸的是,NSURL的東西似乎並不奏效,然而,倍感興趣的是我。第二個參數是一個結構timeval,但它只包含秒...如果我舉例如50000秒,文件日期根本不會改變。我做錯了什麼嗎? –

+0

NSURL終於完美工作!唯一的事情就是用簡單的日期來替換[NSDate date]。謝謝 !! –

+0

對不起,發佈這個答案後不久我就休息了一個星期。第二個參數是一個由兩個結構時間值組成的數組(它衰減到一個指向結構timeval的指針),而不是一個結構timeval。如果你傳遞0,它使用當前時間。手冊頁應解釋所有這一切。 – abarnert