Неблокирующий режим записи файла
Не существует такой вещи как неблокирующий режим записи файла (может быть исключая overlapped I/O, но это за пределами данной книги), но здесь мы можем просто эмулировать механизм это. File1 это условный неблокирующий компонент, размещенной на форме.
procedure TForm1.Button1Click(Sender: TObject);
begin
File1.Filename := 'd:\temp\test.dat';
File1.Open;
end;
procedure TForm1.File1OnOpen(Sender: TObject);
var
i: integer;
begin
FWriteData := 'Hello World!' + #13#10;
i := File1.Write(FWriteData);
Delete(FWriteData, 1, i);
end;
procedure TForm1.File1OnWrite(Sender: TObject);
var
i: integer;
begin
i := File1.Write(FWriteData);
Delete(FWriteData, 1, i);
if Length(FWriteData) = 0 then
begin
File1.Close;
end;
end;
procedure TForm1.File1OnClose(Sender: TObject);
begin
Button1.Enabled := True;
end;
Потратим немного времени, что бы попытаться понять, что здесь делается. Если вы используете неблокирующие сокеты, то вы должны легко понимать данный код. Это примерно следующее:
1. При вызове Button1Click открывается файл. Метод Open немедленно вернет управление в программу, но файл еще не открыт и нельзя с ним еще нельзя работать.
2. Обработчик события OnOpen будет возбужден, когда файл будет открыть и готов к работе. Делается попытка записать данные в файл, но все данные еще не акцептированы. Метод Write вернет количество записанных байт. Оставшиеся данные будут сохранены позже.
3. Обработчик события OnWrite будет возбужден, когда файл будет готов воспринять следующую порцию данных, и метод Write будет повторяться для оставшихся данных.
4. Шаг 3 повторяется до тех пор, пока все данные не будут записаны методом Write. По окончанию записи всех данных вызывается метод Close. Но файл пока еще не закрыт.
5. The OnClose event is fired. The file is now closed.