Сбросить данные файла на диск
Имеется процедура Flush, которая работает с открытыми
файлами:
В руководстве четко не сказано, передает ли (сбрасывает) 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:
Остальное относится ко всем файлам:
Сделайте файлу 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.
|