什么所有Api受{$IOCHECKS关}?
-
12-09-2019 - |
题
我们有一些古老的特尔斐代码(可能甚至起源的涡轮增压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
.它还应该影响 BlockRead
和 BlockWrite
.
你可以检查的源码。任何东西,电话 SetInOutRes
是容易受到 $I
.这包括功能,打开文件(Append
, Reset
, , Rewrite
),以及任何其他接受一个参数的类型 file
或 TextFile
(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
, ,其假设是,他们不会打扰这样做,如果他们不知道的编译器会检查它之后。