2010-07-21 101 views
2

我正在与德尔福2006年TFileStream。当我调用TFileStream.Seek偏移超出界限我得到不同的返回值。当我在流的开始位置寻找位置时,该函数返回-1,如果我寻求一个超出流大小的函数,那么该函数将返回如果流很大时流中的位置。有没有办法来检查流上的查找操作是否成功?为什么TFileStream.Seek在搜索偏移超出当前流大小的界限时不会失败?Delphi TFileStream.Seek,如何检查无效查找偏移量

在此先感谢。

回答

2

是的,你可以寻求超越文件大小 - 在这里没有错误,寻求成功。除此之外,您可以锁定文件区域(请参阅LockFile)超出文件大小 - 这也可以,并且由某些RDBMS用于实现表/记录锁定。

另外,从MSDN:

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

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

+2

这就是TFileStream对'Size'属性的setter实现的方法 - 寻找指定大小的偏移量,然后调用SetEndOfFile()。 – 2010-07-21 21:45:28

0

它调用一个窗口函数,你得到的结果是从Windows函数。

如果Seek值有效,我会倾向于检查您的代码。如果你需要做很多事情,那么可能会创建一个TFileStream的后代,像TRangeCheckingFileStream,它包含范围检查它的seek方法并返回一个你可以期待的值。