Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление файла средствами 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, а т.к файл открытый он не удаляется.


Наверх

Титульная страница Поиск, карта сайта Написать письмо