Советы по Delphi


Чтение данных из файла


Имеется процедура Flush, которая работает с открытыми файлами:

    flush(f);

В руководстве четко не сказано, передает ли (сбрасывает) Flush данные непосредственно на диск. Если это не так, то данные сохраняются в других временных буферах. В качестве дополнительной меры безопасности, я "опускаюсь" для этого вызова в dos. Необходимость данного вызова спорна, но пусть он в нашем случае покажет эту возможность.

Ниже дан пример:



    Uses
Sysutils; var
F    : text;             { это ваш текстовый файл } Procedure TextFlush(F : Text);
var
fhandle   : word; begin
Flush(F); fhandle := ttextrec(F).Handle;       { получаем дескриптор msdos } asm mov  ax, $6800 mov  bx, handle call DOS3CALL end; end;

Если файл является "блочным" файлом, пропускаем шаг с командой flush, и используем tfilerec вместо ttextrec.

Переменная Filemode определяет режим открытия файла (По умолчанию режим эксклюзивный). К сожалению, это не срабатывает для текстовых файлов, поэтому вы должны, используя blockreads писать в буфер, и затем конвертировать части буфера в строку, если вы хотите работать с ним как с текстовым файлом.

Assign, или AssignFile, как вы теперь знаете, не может использоваться с файлом, который уже открыт (я проверял это, и это действительно так). В вашем случае рекомендую обратиться к вызову API OpenFile, ничего в этом страшного нет.

Если это текстовый файл, сбросьте сначала текстовый буфер на диск командой flush:

    flush(f)

Остальное относится ко всем файлам:

Сделайте файлу commit, используя dos-функцию commit, доступную начиная с DOS 5.

    asm mov  ax, $6800                { делаем commit файла } mov  bx, ttextrec(f).handle   { получаем дескриптор файла } call dos3call                 { это предпочтительный способ,  INT $21 также должно работать } end;

Согласно документации Microsoft, данный вызов также сбрасывает буфера SMARTDRIVE. MSDN10 так описывает алгоритм реализации этого на языке приложения:

Для сброса данных, сохраняемых в буфере SMARTDRV.EXE версии 4.0, вы можете воспользоваться одним из следующих способов:

  • Используйте функцию MS-DOS Commit File (которая записывает измененные данные буфера). Это прерывание 21h, функция 68h.
  • Используйте функцию MS-DOS Disk Reset (которая записывает измененные данные и чистит кэш). Это прерывание 21h, функция 0Dh.
[001697]



Содержание раздела