【问题标题】:Replacing Carbon file functions with stdio.h functions用 stdio.h 函数替换 Carbon 文件函数
【发布时间】:2011-06-30 00:48:29
【问题描述】:

我正在尝试转换包含过时 Carbon 函数 FSWrite、FSRead 等的旧代码块。我们想要尝试的一个实验是将它们替换为它们的 POSIX 等效项,即 stdio.h 中定义的函数,例如用 fread() 替换 FSRead()。但我不确定如何处理赋予 Carbon 函数的第一个参数:

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? 的后续问题)

【问题讨论】:

  • 顺便说一句,如果这种努力是愚蠢的,那没关系;我们怀疑这整件事无论如何都需要更深入的重写。

标签: macos macos-carbon stdio


【解决方案1】:

来自gFormatRecord->dataFork,听起来您正在尝试编写 Photoshop 插件。这不会那么好用。

Photoshop(可能是大多数 Mac Adob​​e 软件)充满了很多 Carbon 代码,其设计与现有 8.5 API 基本相同,同时 API/ABI 也与 OS X 兼容(我不知道是否/何时放弃 CFM Carbon 支持)。

根据文档,您应该使用 FSSetForkPosition() 代替,这最终可能会成为相同的函数调用。您几乎可以肯定不能使用fseek()/fsetpos()/fseeko(),它需要FILE *,而根据我的标题,Carbon 文件句柄似乎是 SInt16(网络文档说它是 FSIORefNum)。 [1]

还要注意fopen()和朋友不是POSIX;它们是标准 C。POSIX 函数通常是相同的,没有前导 f,除了 seek 是 lseek()。 [2] POSIX“文件句柄”是一个文件描述符,它只是一个int

现在,如果您非常幸运,FSIORefNum 将只是一个文件描述符,您可以将其传递给read()/write()/lseek()。但这最终没有什么好处;如果 Photoshop 仍然是基于 Carbon 构建的,那有什么意义呢?


脚注!

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

【讨论】:

  • 你所说的 fopen()、fread() 等是否与 open()、read() 等一样正确?
  • 当然不是;一组采用FILE*,另一组采用int。它们是否与 Carbon 调用兼容是任何人的猜测(取决于 Carbon 在 OS X 上的实现方式,它们可能是),但我真的不会在生产代码中依赖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2017-05-14
  • 2018-11-12
  • 2017-03-19
  • 2011-05-07
相关资源
最近更新 更多