【问题标题】:Delphi TFileStream.Seek, how to check for invalid seek offsetDelphi TFileStream.Seek,如何检查无效的查找偏移量
【发布时间】:2010-07-21 15:23:55
【问题描述】:

我在 Delphi 2006 中使用 TFileStream。当我使用超出范围的偏移量调用 TFileStream.Seek 时,我得到不同的返回值。当我寻找低于流开头的位置时,该函数返回 -1,如果我寻找超出流大小的位置,则该函数返回如果流那么大,该位置将是流中的位置。有没有办法检查流上的查找操作是否成功?为什么 Seek 偏移超出当前流大小的范围时 TFileStream.Seek 不会失败?

提前致谢。

【问题讨论】:

    标签: delphi filestream tfilestream


    【解决方案1】:

    是的,您可以在文件大小之外进行搜索 - 此处没有错误,则搜索成功。不仅如此,您还可以锁定超出文件大小的文件区域(请参阅LockFile)——这也可以,某些 RDBMS 使用它来实现表/记录锁定。

    同样来自 MSDN:

    设置文件不是错误 指向结束位置的指针 的文件。文件的大小确实 在你打电话之前不要增加 SetEndOfFile、WriteFile 或 WriteFileEx 函数。一个写 操作增加了的大小 文件到文件指针位置加 写入缓冲区的大小,其中 导致中间字节 未初始化。

    因此,通过将文件指针设置为超出文件大小,您可以随后增加文件大小(例如通过 SetEndOfFile)。

    【讨论】:

    • 这正是 TFileStreamSize 属性的设置器的实现方式 - 查找指定的大小偏移量,然后调用 SetEndOfFile()
    【解决方案2】:

    它调用一个windows函数,你得到的结果来自windows函数。

    如果 Seek 值有效,我会倾向于检查您的代码。如果您经常需要这样做,那么可以创建 TFileStream 的后代,例如 TRangeCheckingFileStream,它在其 seek 方法中包括范围检查并返回您可以预期的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      相关资源
      最近更新 更多