2

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

提前致谢。

4

2 回答 2

2

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

同样来自 MSDN:

将文件指针设置为超出文件末尾的位置并不是错误。在调用 SetEndOfFile、WriteFile 或 WriteFileEx 函数之前,文件的大小不会增加。写入操作将文件的大小增加到文件指针位置加上写入的缓冲区大小,这会导致中间字节未初始化。

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

于 2010-07-21T15:43:36.117 回答
0

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

如果 Seek 值有效,我会倾向于检查您的代码。如果您需要经常执行此操作,则可以创建 TFileStream 的后代,例如 TRangeCheckingFileStream ,其中包括在其 seek 方法中的范围检查并返回您可以期望的值。

于 2010-07-21T15:50:04.587 回答