我正在尝试转换包含过时的Carbon函数FSWrite,FSRead等的旧代码。我们要尝试的一个实验是将它们替换为它们的POSIX等价物,即stdio.h中定义的函数,例如:用fread()替换FSRead()。但我不知道如何处理碳功能的第一个arg:
SetFPos(gFormatRecord->dataFork, fsFromStart, 0);
gFormatRecord是指向FormatRecord的指针。 dataFork只是一个普通的常规unixy文件句柄,适合推入fread(),fprintf()等吗? (在任何情况下,我都不太了解文件“forks”。)
(这是我之前提问的后续问题On a Mac, where are FSRead, FSWrite, SetFPos et al defined, and should I even be using them?)
答案 0 :(得分:2)
从gFormatRecord->dataFork
开始,听起来你正在尝试编写一个Photoshop插件。那不会那么好。
Photoshop(大概是大多数Mac Adobe软件)充满了很多的Carbon代码,其设计与现有的8.5 API大致相同,同时也与OS X兼容API / ABI(我不知道CFM碳支持是否/何时被取消了。)
根据文档,您应该使用FSSetForkPosition(),这最终可能最终成为相同的函数调用。您几乎肯定无法使用期望fseek()
的{{1}} / fsetpos()
/ fseeko()
,而根据我的标题,碳文件句柄似乎是SInt16( webdocs说它是FSIORefNum)。 [1]
另请注意FILE *
和朋友不是POSIX;它们是标准的C.除了fopen()
的搜索之外,POSIX函数通常是相同的而没有前导f。 [2] POSIX“文件句柄”是一个文件描述符,只是lseek()
。
现在,如果您非常幸运,那么FSIORefNum将只是一个文件描述符,您可以将其传递给int
/ read()
/ write()
。但这最终没什么好处;如果Photoshop仍然建立在Carbon上,那有什么意义呢?
脚注!
lseek()
左右才能获得大文件支持,这很容易被遗忘。遗憾的是,普遍这样做并不容易......