Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Удаление файла средствами 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.075 c
2-1392456356
lewka
2014-02-15 13:25
2015.09.10
помогите с запросом в SQL, пожалуйста


2-1397985451
Andrey5
2014-04-20 13:17
2015.09.10
Проверка пароля


15-1413646158
tomkat
2014-10-18 19:29
2015.09.10
не запускается Delphi


15-1409765726
Павиа
2014-09-03 21:35
2015.09.10
Осторожно. Новый вид атак.


2-1398332811
FIL-23
2014-04-24 13:46
2015.09.10
ShellExecute в XE5 не компилится