![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
I/O Error 32 при Rewrite [D7, XP]
silversmith © (2006-10-29 14:52:00)Есть примерно следующая процедура
var
fv:textfile;
begin
AssignFile(fv,'1.txt');
Rewrite(fv);
....
CloseFile(fv);
end;
При повторном вызове вылетает с ошибкой I/O Error 32.
Ошибка вылетает даже в том случае если я при повторном вызове физически стираю файл 1.txt с диска.
Как побороть?
Anatoly Podgoretsky (2006-10-29 17:12:00) [1]> Ответ на сообщение [8]
Не позволять повторно открыть и узнавать не надо будет.
Обеспечить защиту ресурсов, что бы при любых ситуациях файл закрывался.
Обрывок твоего кода не позволяет одназначно говорить, что и где делать,
неясно даже это функция/процедура или что то другое.
silversmith (2006-10-29 16:34:00) [2]Изменил код следующим образом:
var
fv:textfile;
begin
AssignFile(fv,'1.txt');
Rewrite(fv);
CloseFile(fv);
AssignFile(fv,'1.txt');
Append(fv);
for i:=1 to n do begin
writeln(fv,...);
end;
CloseFile(fv);
end;
Вы будете смеятся, но так заработало. Если кто объяснит почему эот код работает при том, что не работал предыдущий буду премного благодарен.
Мерно постукивая в бубен удаляюсь отплясывать ритуальный танец вокруг компьютера.
silversmith (2006-10-29 16:21:00) [3]Мнэ.. ну а все таки. Если я повторно вызываю CloseFile возникает ошибка I/O Error 103 файл не открыт. Стало быть файл таки закрывается?
silversmith (2006-10-29 15:38:00) [4]А как узнать что он гарантировано закрыт?
IOResult после выплонения CloseFile = 0. Никаких исключений при закрытии не возникает.
Anatoly Podgoretsky (2006-10-29 15:28:00) [5]> Ответ на сообщение [5]
> Процедура вызывается по нажатию на кнопку на главной форме.
> При втором нажатии вылетает I/O Error32.
Не нажимай пока файл гарантировано не будет закрыт
sniknik (2006-10-29 15:25:00) [6]> Error 32
в переводе на русский -
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом
> Примерна такая:
ну так она примернаправильно и выполняется...
сделал из примерной точную... и сколько не жму на кнопку, от повторов ошибок нет...
procedure TForm1.Button1Click(Sender: TObject);
var
fv: textfile;
i: integer;
begin
AssignFile(fv, '1.txt');
Rewrite(fv);
for i:=1 to 10 do
writeln(fv, 'kljkljkl');
CloseFile(fv);
end;
форматирование наверное помогло... ;о))
silversmith (2006-10-29 15:11:00) [7]>>if ... then Exit?
Такого нет. Вообще процедура практически линейна. Примерна такая:
var
fv:textfile;
begin
AssignFile(fv,'1.txt');
Rewrite(fv);
for i:=1 to n do begin
writeln(fv,...);
end;
CloseFile(fv);
end;
>>блок защиты ресурсов
???
>>кроме того не видать сколько раз ты это вызвал.
Процедура вызывается по нажатию на кнопку на главной форме. При втором нажатии вылетает I/O Error32.
>>Дельфи по барабану, если дойдет дело до данной строчки то она ее выполнит.
Пошагово прогоняю программу. Строка CloseFile(fv) выполняется.
Орион (2006-10-29 15:06:00) [8]> [2] silversmith (29.10.06 15:04)
а у тебя случаем в процедуре нет подобногоif ... then Exit? Короче говоря: ты уверен, что до CloseFile дело доходит?
Anatoly Podgoretsky (2006-10-29 15:06:00) [9]> Ответ на сообщение [2]
> То что я CloseFile(fv) вызвал в конце процедуры это Дельфи по барабану?
Этого не видать поскольку отсутствует блок защиты ресурсов, кроме того не
видать сколько раз ты это вызвал.
Дельфи по барабану, если дойдет дело до данной строчки то она ее выполнит.
silversmith (2006-10-29 15:04:00) [10]Я что-то не пойму. То что я CloseFile(fv) вызвал в конце процедуры это Дельфи по барабану?
Anatoly Podgoretsky (2006-10-29 14:58:00) [11]> Ответ на сообщение [0]
Нельхя повторно открывать пока старый файл не закрыт.