![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление файла средствами Delphi [D5, D7, XP]
JohnKorsh © (2014-01-29 16:06:00)Добрый день!
Не поможет ли кто разобраться, почему не удаётся удалить файл средствами Delphi?
Файл инициализации программы. Текстовый - записаны целые и плавающие,
преобразованные в стринг для удобства контроля,
при загрузке - обратное преобразование.
Поскольку программа модеонизируется, файл меняется.
Чтобы не загружать пользователя решил программно его удалять при ошибке в чтении.
(При его отсутствии программа ставит параметры по умолчанию).
procedure TMain_Form.FormActivate(Sender: TObject);
.......
try
if FileExists (Home_Dir + Init_File) = true then
begin
AssignFile (Init_F, Home_Dir + Init_File);
Reset (Init_F);
ReadLn (Init_F, S);
ReadLn (Init_F, Code_Words);
.......
CloseFile (Init_F);
end;
except
Beep;
ShowMessage (' Ошибка в файле инициализации.' + Chr ($0D) + Chr ($0A) +
' Перезапустите программу.');
if FileExists (Home_Dir + Ind_File) = true then
begin
FileSetAttr (Home_Dir + Ind_File, 0);
DeleteFile (Home_Dir + Ind_File);
end;
Halt (1);
end;
.......
Не удаётся удалить файл при возникновении ошибки чтения.
Появляется сообщение, звуковой сигнал и происходит останов программы.
Если в этом месте программы попробовать удалять другие файлы,
удаляются. Видимо, так влияет ошибка.
Как грамотно написать код в этом случае?
JohnKorsh (2014-03-05 21:46:00) [1]Спасибо ещё раз. Есть чему учиться.
Dennis I. Komarov (2014-02-03 21:00:00) [2]
> stas © (03.02.14 11:10) [11]
1. А если exception на Reset()?
2. Про TApplication разговора не было
3. Есть TFileStream, зачем Assign/Reset/Close?
4. Delete is function
P.S. Если память не изменяет, CloseFile не гарантирует освобождение файла...
stas (2014-02-03 11:10:00) [3]>Baks (03.02.14 00:38) [10]
тогда уже учтем замечание ИШ
if FileExists(Home_Dir + Init_File) then
begin
AssignFile(Init_F, Home_Dir + Init_File);
Reset(Init_F);
try
try
while not Eof(Init_F) do
begin
ReadLn(Init_F, S);
ReadLn(Init_F, Code_Words);
end
finally
CloseFile(Init_F);
end;
except
on e:Exception do
ShowMessage ('Ошибка в файле инициализации:'+e.Message+' Перезапустите программу.');
DeleteFile(Init_F);
Application.Terminate;
Exit;
end;
end
else
SetDefaultParams;
Baks (2014-02-03 00:38:00) [4]Я бы так сделал:
if FileExists(Home_Dir + Init_File) then
begin
AssignFile(Init_F, Home_Dir + Init_File);
Reset(Init_F);
try
try
while not Eof(Init_F) do
begin
ReadLn(Init_F, S);
ReadLn(Init_F, Code_Words);
end
finally
CloseFile(Init_F);
end;
except
ShowMessage ('Ошибка в файле инициализации. Перезапустите программу.');
DeleteFile(Init_F);
Application.Terminate;
Exit;
end;
end
else
SetDefaultParams;
картман (2014-02-01 00:12:00) [5]да он вроде как сказал:
> Текстовый - записаны целые и плавающие,
> преобразованные в стринг для удобства контроля,
> при загрузке - обратное преобразование.
> Поскольку программа модеонизируется, файл меняется.
(2014-01-31 23:48:00) [6]Удалено модератором
Игорь Шевченко (2014-01-31 23:36:00) [7]Тех, кто скрывает текст исключения, надо прилюдно убивать. Медленно и с наслаждением.
Dennis I. Komarov (2014-01-31 21:27:00) [8]К лешему, reset.
DeleteFile функция
Dir это не Path
JohnKorsh (2014-01-29 18:09:00) [9]Спасибо.
Palladin (2014-01-29 16:28:00) [10]хотя бы так, делать не надо
FullFileName := Init_F, Home_Dir + Init_File;
if not FileExists(FullFileName) then
Exit;
try
AssignFile (Init_F, FullFileName);
Reset (Init_F);
try
ReadLn (Init_F, S);
ReadLn (Init_F, Code_Words);
.......
finally
CloseFile(Init_F);
end;
except
Beep;
ShowMessage (' Ошибка в файле инициализации.'#13#10' Перезапустите программу.');
DeleteFile (FullFileName);
Application.Terminate;
end;
stas (2014-01-29 16:18:00) [11]хотя бы так
flag=1
AssignFile (Init_F, Home_Dir + Init_File);
Reset (Init_F);
try
if FileExists (Home_Dir + Init_File) = true then
begin
ReadLn (Init_F, S);
ReadLn (Init_F, Code_Words);
.......
end;
flag=0;
except
end;
CloseFile (Init_F);
if flag=1 then
begin
Beep;
ShowMessage (' Ошибка в файле инициализации.' + Chr ($0D) + Chr ($0A) +
' Перезапустите программу.');
if FileExists (Home_Dir + Ind_File) = true then
begin
FileSetAttr (Home_Dir + Ind_File, 0);
DeleteFile (Home_Dir + Ind_File);
end;
Halt (1);
end;
Palladin (2014-01-29 16:14:00) [12]
FileExists (Home_Dir + Init_File)
уже имеет значение true или false, зачем его еще раз сравнивать с true? что бы получить true или false?
не нужно постоянно складывать строки, заведи переменную
FullFileName := Home_Dir + Init_File;
уже проще читать и меньше нагрузки
поведение исключения при чтении, читал читал и тут исключение, код ПРЕРЫВАЕТСЯ и уходит в секцию except, а что у нас в конце чтения? правильно, вызов closefile, закрытие файла, соответственно в except мы попадаем с открытым файлом, заблокированным на данный момент, конечно он не удалится
дабы этого избежать идем и читаем про секцию finally в которую должны попадать операторы обязательные для исполнения
stas (2014-01-29 16:13:00) [13]потому что у вас открылся файл, потом ошибка, попадаем в except, а т.к файл открытый он не удаляется.