2011-06-30 12 views
0

我試圖轉換一個包含過時的碳函數FSWrite,FSRead等的舊代碼塊。我們想要嘗試的一個實驗是用它們的POSIX等價物替換這些函數,函數在stdio.h中定義,例如用fread()替換FSRead()。但我不知道該怎麼辦給予碳功能的第一個參數:使用stdio.h函數代替碳文件函數

SetFPos(gFormatRecord->dataFork, fsFromStart, 0); 

gFormatRecord是一個指向FormatRecord。 dataFork只是一個普通的常規unixy文件句柄,適合推入fread(),fprintf()等? (我沒有在任何情況下很瞭解文件「叉」。)

(這是一個後續行動,我剛纔的問題,On a Mac, where are FSRead, FSWrite, SetFPos et al defined, and should I even be using them?

+0

順便說一句,如果這種努力是愚蠢的,那沒關係;無論如何,我們懷疑這整件事情需要更深入的重寫。 – DarenW

回答

2

gFormatRecord->dataFork,這聽起來像你想寫一個Photoshop插件。這不會奏效。 Carbon代碼充滿了批次,它被設計成與現有的8.5 API大部分相同,同時API/ABI與OS X兼容(我不需要與OS X兼容(我不提供)知道是否/何時CFM碳支持下降)。

根據文檔,你應該使用FSSetForkPosition()來代替,這可能最終會成爲相同的函數調用。你幾乎肯定不能使用fseek()/fsetpos()/fseeko(),期望FILE *,而Carbon文件句柄根據我的頭文件顯示爲SInt16(webdocs說它是FSIORefNum)。 [1]

另請注意,fopen()和朋友不是POSIX;它們是標準C的。除了搜索是lseek(),POSIX函數通常是相同的,沒有前導f。 [2] POSIX「文件句柄」是一個文件描述符,它只是一個int

現在,如果你是難以置信幸運,一個FSIORefNum將只是一個文件描述符,你可以傳遞給read()/write()/lseek()。但這最終沒有什麼好處。如果Photoshop仍然建立在Carbon上,那有什麼意義?


腳註!

  1. 這不是不可能的FSEEK()特殊情況下指針指向零頁,但我不認爲他們會污染的libc這一點。)
  2. 在Linux/x86上,你需要#define __FILE_OFFSET_BITS 64左右,以獲得largefile支持,這是很容易忘記。恥辱這樣做普遍不容易...
+0

是你說的fopen(),fread()等,就像真正的open(),read()等? – DarenW

+0

當然不是;一組採用'FILE *',另一組採用'int'。無論他們是否與Carbon調用兼容,都是人們的猜測(取決於Carbon在OS X上的實現方式,他們可能會這樣做),但我真的不會在生產代碼中依賴它。 –