Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1413270428
Dimka Maslov
2014-10-14 11:07
2015.09.10
Задачка::Проверка бита


2-1393856756
GroupBox
2014-03-03 18:25
2015.09.10
Скрыть рамку котрола


15-1418739220
Dennis I. Komarov
2014-12-16 17:13
2015.09.10
Большой csv


15-1421425875
SergP
2015-01-16 19:31
2015.09.10
Перепаковать архивы 7z в zip


6-1276442822
Иван
2010-06-13 19:27
2015.09.10
Проблема при передачи tcpserver tcpclient





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский