Delphi TFileStream.Seek, как проверить недопустимое смещение поиска
Я работаю с TFileStream в Delphi 2006. Когда я вызываю TFileStream.Seek со смещением, которое выходит за пределы, я получаю разные возвращаемые значения. Когда я пытаюсь найти позицию ниже начала потока, функция возвращает -1, а если я пытаюсь выйти за пределы размера потока, функция возвращает то, что было бы позицией в потоке, если бы поток был таким большим. Есть ли способ проверить, была ли операция поиска в потоке успешной? Почему TFileStream.Seek не завершается ошибкой, когда смещения поиска выходят за пределы текущего размера потока?
Заранее спасибо.
2 ответа
Да, вы можете искать файл за пределами размера - здесь нет ошибок, поиск успешен. Более того, вы можете заблокировать область файла (см. LockFile) за пределы размера файла - это тоже нормально и используется некоторыми СУБД для реализации блокировки таблицы / записи.
Также из MSDN:
Не является ошибкой устанавливать указатель файла на позицию за концом файла. Размер файла не увеличивается, пока вы не вызовете функцию SetEndOfFile, WriteFile или WriteFileEx. Операция записи увеличивает размер файла до позиции указателя файла плюс размер записанного буфера, что приводит к неинициализированным промежуточным байтам.
Таким образом, установив указатель файла за пределы размера файла, вы можете впоследствии увеличить размер файла (например, с помощью SetEndOfFile).
Вызывает функцию Windows, и результат, который вы получаете от функции Windows.
Я бы хотел проверить в вашем коде, допустимо ли значение Seek. Если вам нужно сделать это много, то, возможно, создайте потомка TFileStream, что-то вроде TRangeCheckingFileStream, который включает проверки диапазона в своем методе поиска и возвращает значение, которое вы можете ожидать.