我们有一些古老的特尔斐代码(可能甚至起源的涡轮增压Pascal代码)使用 {$I-}, aka {$IOCHECKS OFF}, ,这使得使用代码 IOResult 而不是例外的磁盘I/O错误。

我想要摆脱的 {$I-} 把这码进入1990年代,但要做到这一点,我想知道什么所有被影响的 {$IOCHECKS OFF}.这不仅影响的零碎的旧内I/O functions像AssignFile/重新设置/改写/Append/CloseFile?或者这是否会影响更多的现代的东西就像TFileStream?更重要的是,还有什么可能会受到影响,我不在想什么?(德尔菲基础知识 表明,它还会影响MkDir和RmDir.如果影响的那些,必须有更多。)

德尔福2007年帮助"专题的输入输出的检查(Delphi)"(ms-help://borland.bds5/devcommon/compdirsinput_outputchecking_xml.html)说,这会影响"I/O程序[s]",以及"I/O程序中所述的特尔斐语言指南》。" 这没有太大的帮助,因为codegear出现从来没有运的语言指南,并最后一次Borland运之一是德尔斐5.

其功能和类别不同的表现下 {$I-}?


编辑: 所接受的答案给一些伟大的背景,但是,这里的快速摘要中按字母顺序排列形式: {$IOCHECKS OFF} 影响到以下的例行程序,从系统单元。

  • 追加
  • BlockRead
  • BlockWrite
  • ChDir
  • CloseFile
  • Eof
  • Eoln
  • 擦除
  • FilePos
  • FileSize
  • 冲水
  • MkDir
  • 阅读
  • Readln
  • 重命名
  • 重置
  • 重写
  • RmDir
  • 寻找
  • SeekEof
  • SeekEoln
  • SetLineBreakStyle
  • 截断
  • Writeln
有帮助吗?

解决方案

由于 $I 是一个编译器的指令,它可能只影响编译器而产生的代码,并且它可能只影响的代码实际上得到编制。

对于这两个原因, 不能 影响喜欢的东西 TFileStream.它是一类的 课程。pas, ,这是一个单元,你不要编译。任何代码在它不是影响 $I 指令。此外,编译器不享这类专门以任何方式。这只是一个普通类。

$I 指令影响的语言建立在功能,你已经提到。编译器生成的电话给那些职能。它也影响到电话来 write, writeln, , readln.它还应该影响 BlockReadBlockWrite.

你可以检查的源码。任何东西,电话 SetInOutRes 是容易受到 $I.这包括功能,打开文件(Append, Reset, , Rewrite),以及任何其他接受一个参数的类型 fileTextFile (Flush, BlockRead, BlockWrite, Erase, FilePos, Seek, FileSize, Read, Readln, Write, Writeln, Rename, Eof, SeekEof, Eoln, SeekEol, Truncate, SetLineBreakStyle, , CloseFile).此外,任何东西,电话 InOutError (ChDir, MkDir, amd RmDir).

值得注意的是没有从清单是 AssignFile.这一职能实际上不做任何I/O.这只是设立文件记录,这样, Append, Reset, , Rewrite 将会知道该怎么做。


我应该指出的是,看看源代码的只是推断。的 $I 指令控制编译器是否将插入电话的 __IOTest 功能在自己的代码之后,你叫某些其他的功能。这一功能检查的价值 InOutRes, ,如果它不是零,它提出了一个错误的时间(可能产生异常 SysUtils 是包含在你的节目)。我们不可能检查的源代码 直接 找出什么样的功能的影响 $I (因为它只呼吁在编译器而产生的代码),所以我们真的只是在寻找它的功能 设置 InOutRes, ,其假设是,他们不会打扰这样做,如果他们不知道的编译器会检查它之后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top