Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизУдаление файла средствами Delphi Найти похожие ветки
← →
JohnKorsh (2014-01-29 16:06) [0]Добрый день!
Не поможет ли кто разобраться, почему не удаётся удалить файл средствами 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;
.......
Не удаётся удалить файл при возникновении ошибки чтения.
Появляется сообщение, звуковой сигнал и происходит останов программы.
Если в этом месте программы попробовать удалять другие файлы,
удаляются. Видимо, так влияет ошибка.
Как грамотно написать код в этом случае?
← →
stas © (2014-01-29 16:13) [1]потому что у вас открылся файл, потом ошибка, попадаем в except, а т.к файл открытый он не удаляется.
← →
Palladin © (2014-01-29 16:14) [2]
FileExists (Home_Dir + Init_File)
уже имеет значение true или false, зачем его еще раз сравнивать с true? что бы получить true или false?
не нужно постоянно складывать строки, заведи переменную
FullFileName := Home_Dir + Init_File;
уже проще читать и меньше нагрузки
поведение исключения при чтении, читал читал и тут исключение, код ПРЕРЫВАЕТСЯ и уходит в секцию except, а что у нас в конце чтения? правильно, вызов closefile, закрытие файла, соответственно в except мы попадаем с открытым файлом, заблокированным на данный момент, конечно он не удалится
дабы этого избежать идем и читаем про секцию finally в которую должны попадать операторы обязательные для исполнения
← →
stas © (2014-01-29 16:18) [3]хотя бы так
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:28) [4]хотя бы так, делать не надо
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;
← →
JohnKorsh (2014-01-29 18:09) [5]Спасибо.
← →
Dennis I. Komarov © (2014-01-31 21:27) [6]К лешему, reset.
DeleteFile функция
Dir это не Path
← →
Игорь Шевченко © (2014-01-31 23:36) [7]Тех, кто скрывает текст исключения, надо прилюдно убивать. Медленно и с наслаждением.
← →
имя (2014-01-31 23:48) [8]Удалено модератором
← →
картман © (2014-02-01 00:12) [9]да он вроде как сказал:
> Текстовый - записаны целые и плавающие,
> преобразованные в стринг для удобства контроля,
> при загрузке - обратное преобразование.
> Поскольку программа модеонизируется, файл меняется.
← →
Baks (2014-02-03 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
ShowMessage ("Ошибка в файле инициализации. Перезапустите программу.");
DeleteFile(Init_F);
Application.Terminate;
Exit;
end;
end
else
SetDefaultParams;
← →
stas © (2014-02-03 11:10) [11]>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;
← →
Dennis I. Komarov © (2014-02-03 21:00) [12]
> stas © (03.02.14 11:10) [11]
1. А если exception на Reset()?
2. Про TApplication разговора не было
3. Есть TFileStream, зачем Assign/Reset/Close?
4. Delete is function
P.S. Если память не изменяет, CloseFile не гарантирует освобождение файла...
← →
JohnKorsh (2014-03-05 21:46) [13]Спасибо ещё раз. Есть чему учиться.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c