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

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

Ошибка ввода/вывода при записи в текстовый файл [D6, XP]


Страницы:   1 2

Vpp ©   (2007-05-23 16:09:00) 

Задача: дописывать в текстовый файл при необходимости текст. Для этого сделал такую функцию:

procedure TMainForm.Work;
var
 LogFile: TextFile;
begin
 AssignFile(LogFile,ExtractFilePath(ParamStr(0))+'repair.log');
 Reset(LogFile);

 WriteLn(LogFile,'Тест');

 CloseFile(LogFile);
end;

I/O error 105 выдает на команде WriteLn и ничего в файл записывать не хочет. Файл repair.log существует и находится в одном каталоге с exe-файлом программы.

Уважаемые мастера, подскажите пожалуйста, в чем моя ошибка?


Vpp   (2007-05-23 18:13:00) [1]

{RASkov} ©   (23.05.07 18:07) [23]

> причем и не обязательно останавливать работу программы

Да, над этим подумаю, спасибо


{RASkov}   (2007-05-23 18:07:00) [2]

> [22] Vpp   (23.05.07 18:02)
> Да, я все это понимаю, просто в данном случае ценнее ошибку
> именно подавить. Потому что эта функция должна дополнять
> лог-файл одного процесса поднятия базы (общая прога называется
> repair.exe), который планируется запускать в автоматическом
> режиме. Поэтому если будут возникать сообщения, repair остановится,
> а это нехорошо :)

Дело твое.... но еще раз... лучше ошибку обработать, чем скрыть.... причем и не обязательно останавливать работу программы....
"Сообщение показать" - это было в пример....


Vpp   (2007-05-23 18:02:00) [3]

{RASkov} ©   (23.05.07 17:43) [21]

Да, я все это понимаю, просто в данном случае ценнее ошибку именно подавить. Потому что эта функция должна дополнять лог-файл одного процесса поднятия базы (общая прога называется repair.exe), который планируется запускать в автоматическом режиме. Поэтому если будут возникать сообщения, repair остановится, а это нехорошо :)


{RASkov}   (2007-05-23 17:43:00) [4]

> что не мого мол

*могу


{RASkov}   (2007-05-23 17:42:00) [5]

> [19] Vpp   (23.05.07 17:37)
> Последний вариант мне больше понравился. При ошибке открытия
> файла прога просто ничего не будет дописывать в лог. Молча...
> :)


> except
> end;

А это зря, это называется подавление/скрытие ошибки.... Пусть хотябы добавит в лог какой файл не удалось открыть... Вообщем
> except
> end;

нужно все равно чем-нить заполнить :) Сообщение показать, что не мого мол файл открыть....
иначе потом, через некоторое время, твоя прога скроет ошибку, а ты будешь голову ломать, да почему-же не работает...


Vpp   (2007-05-23 17:37:00) [6]

{RASkov} ©   (23.05.07 17:32) [16]

Последний вариант мне больше понравился. При ошибке открытия файла прога просто ничего не будет дописывать в лог. Молча... :)

procedure TMainForm.Log(C: String);
var
 LogFile: TextFile;
begin
 C:=DateToStr(SysUtils.Date)+' - '+TimeToStr(SysUtils.Time)+' - '+C;
 try
   AssignFile(LogFile,ExtractFilePath(ParamStr(0))+'repair.log');
   if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
   then Rewrite(LogFile) else Append(LogFile);
   try
     WriteLn(LogFile,C);
     Flush(LogFile);
   finally
     CloseFile(LogFile);
   end;
 except
 end;
end;


{RASkov}   (2007-05-23 17:36:00) [7]

В последнем варианте

> except
>  < здесь обрабатывай ошибку открытия файла>
> end;

Тут не только в момент открытия может произойти ошибка... Т.е. здесь нужно быть готовым обработать любую ошибку между try и except вместе с внутренним try finally end;


Vpp   (2007-05-23 17:33:00) [8]

Loginov Dmitry ©   (23.05.07 17:05) [13]
ANB ©   (23.05.07 17:27) [15]

Убедили :)   Итак,

procedure TMainForm.Log(C: String);
var
 LogFile: TextFile;
begin
 C:=DateToStr(SysUtils.Date)+' - '+TimeToStr(SysUtils.Time)+' - '+C;
 AssignFile(LogFile,ExtractFilePath(ParamStr(0))+'repair.log');
 if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
 then Rewrite(LogFile) else Append(LogFile);
 try
   WriteLn(LogFile,C);
   Flush(LogFile);
 finally
   CloseFile(LogFile);
 end;
end;


{RASkov}   (2007-05-23 17:32:00) [9]

> [14] Vpp   (23.05.07 17:12)

 if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
  then Rewrite(LogFile) else Append(LogFile);
 try
  WriteLn(LogFile,C);
  Flush(LogFile);
 finally
  CloseFile(LogFile);
 end;

Если до try будет ошибка, то до финала не дойдет дело....

> А если exception происходит во время открытия, тогда CloseFile не выполнится

Ну дык он и не откроется....Здесь тогда нужно как нить так:
 try
  if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
   then Rewrite(LogFile) else Append(LogFile);
 except
  <здесь обрабатывай ошибку открытия файла>
 end;
 try
  WriteLn(LogFile,C);
  Flush(LogFile);
 finally
  CloseFile(LogFile);
 end;

или так:
 try
  if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
   then Rewrite(LogFile) else Append(LogFile);
  try
   WriteLn(LogFile,C);
   Flush(LogFile);
  finally
   CloseFile(LogFile);
  end;
 except
  <здесь обрабатывай ошибку открытия файла>
 end;


ANB   (2007-05-23 17:27:00) [10]


> А если exception происходит во время открытия, тогда CloseFile
> не выполнится.

И не надо - нафига закрывать то, что не открылось ?


Vpp   (2007-05-23 17:12:00) [11]

Loginov Dmitry ©   (23.05.07 17:05) [13]

> Открытие файла следует сделать до TRY

А если exception происходит во время открытия, тогда CloseFile не выполнится. Не лучше ли открытие все-таки прятать в try..finally ?


Loginov Dmitry   (2007-05-23 17:05:00) [12]

Открытие файла следует сделать до TRY


Vpp   (2007-05-23 16:57:00) [13]

{RASkov} ©   (23.05.07 16:45) [11]

Вот так процедура сейчас выглядит:

procedure TMainForm.Log(C: String);
var
 LogFile: TextFile;
begin
 C:=DateToStr(SysUtils.Date)+' - '+TimeToStr(SysUtils.Time)+' - '+C;
 AssignFile(LogFile,ExtractFilePath(ParamStr(0))+'repair.log');
 try
   if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
   then Rewrite(LogFile) else Append(LogFile);
   WriteLn(LogFile,C);
   Flush(LogFile);
 finally
   CloseFile(LogFile);
 end;
end;


{RASkov}   (2007-05-23 16:45:00) [14]

> [10] Vpp   (23.05.07 16:39)
> Спасибо! Уже учел :)

туда же и обработку исключений не забудь.... на будущее пригодиться...
в таких местах программы она необходима...
try
finally
end;


Vpp   (2007-05-23 16:39:00) [15]

Loginov Dmitry ©   (23.05.07 16:34) [9]

Спасибо! Уже учел :)


Loginov Dmitry   (2007-05-23 16:34:00) [16]

> if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log')
> then Rewrite(LogFile);
> Append(LogFile);


И Rewrite и Append - это функции открытия файла. Нужно использоваться что-нибудь одно, но никак не вместе. Например:

if FileExists('repair.log') then
 Append(LogFile)
else
 Rewrite(LogFile)


Vpp   (2007-05-23 16:28:00) [17]

Вот спасибочки :)

procedure TMainForm.Work;
var
 LogFile: TextFile;
begin
 AssignFile(LogFile,ExtractFilePath(ParamStr(0))+'repair.log');
 if not FileExists(ExtractFilePath(ParamStr(0))+'repair.log') then Rewrite(LogFile);
 Append(LogFile);
 WriteLn(LogFile,'Тест');
 Flush(LogFile);
 CloseFile(LogFile);
end;

2 Просто_новичок   (23.05.07 16:16) [4]

это обращение к имени файла repair.log, который находится в той же папке, что и исполняемый модуль программы.
Вот так все работает отлично.


{RASkov}   (2007-05-23 16:22:00) [18]

> [4] Просто_новичок   (23.05.07 16:16)

Тоже самое что и ExtractFileDir(ParamStr(0)), только еще и слешь в конце :о) Чесно.
F1 больше расскажет...


apic   (2007-05-23 16:21:00) [19]

ParamStr(0)- содержит полный путь к твоей, запущенной программе, включая ее имя!
Функция ExtractFilePath из полного пути извлекает только папку к файлу!


iXT   (2007-05-23 16:19:00) [20]

> [4] Просто_новичок   (23.05.07 16:16)
> Подскажите плиз, а что такое ExtractFilePath(ParamStr(0)
> )?

Label1.Caption:=ParamStr(0);
Label2.Caption:=ExtractFilePath(ParamStr(0));
:) Трудно?


Страницы:   1 2

Наверх

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