用stdio.h函数替换Carbon文件函数

时间:2011-06-30 00:48:30

标签: macos macos-carbon stdio

我正在尝试转换包含过时的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?

1 个答案:

答案 0 :(得分:2)

gFormatRecord->dataFork开始,听起来你正在尝试编写一个Photoshop插件。那不会那么好。

Photoshop(大概是大多数Mac Adob​​e软件)充满了很多的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上,那有什么意义呢?


脚注!

  1. fseek()特殊情况指针指向零页面并非不可能,但我认为它们不会污染libc。)
  2. 在Linux / x86上,您需要lseek()左右才能获得大文件支持,这很容易被遗忘。遗憾的是,普遍这样做并不容易......