Delphi TFileStream.Seek, как проверить недопустимое смещение поиска - PullRequest
2 голосов
/ 21 июля 2010

Я работаю с TFileStream в Delphi 2006. Когда я вызываю TFileStream.Seek со смещением, выходящим за пределы, я получаю разные возвращаемые значения. Когда я пытаюсь найти позицию ниже начала потока, функция возвращает -1, а если я пытаюсь выйти за пределы размера потока, функция возвращает то, что было бы позицией в потоке, если бы поток был таким большим. Есть ли способ проверить, была ли операция поиска в потоке успешной? Почему TFileStream.Seek не завершается с ошибкой, когда смещения поиска выходят за пределы текущего размера потока?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 июля 2010

Да, вы можете искать файл за пределами размера - здесь нет ошибок, поиск успешен.Более того, вы можете заблокировать область файла (см. LockFile ) за пределами размера файла - это тоже нормально и используется некоторыми СУБД для реализации блокировки таблицы / записи.

Также из MSDN

Не является ошибкой установка указателя файла на позицию за концом файла.Размер файла не увеличивается до тех пор, пока вы не вызовете функцию SetEndOfFile, WriteFile или WriteFileEx.Операция записи увеличивает размер файла до позиции указателя файла плюс размер записанного буфера, что приводит к неинициализированным промежуточным байтам.

Таким образом, установив указатель файла сверх размера файла, который выможет впоследствии увеличить размер файла (например, с помощью SetEndOfFile).

0 голосов
/ 21 июля 2010

Вызывает функцию Windows, и результат, который вы получаете, от функции Windows.

Я бы хотел проверить в вашем коде, допустимо ли значение Seek. Если вам нужно сделать это много, то, возможно, создайте потомка TFileStream, что-то вроде TRangeCheckingFileStream, который включает проверки диапазона в своем методе поиска и возвращает ожидаемое значение.

...