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

Вниз

Ошибка ввода/вывода при записи в текстовый файл   Найти похожие ветки 

 
Vpp   (2007-05-23 16:09) [0]

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

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-файлом программы.

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


 
Elen ©   (2007-05-23 16:14) [1]

надо не reset а append. И вообще можно файл не закрывать пока прога не закроется.


 
iXT ©   (2007-05-23 16:15) [2]

И правильно делает :) Надо посмотреть справку по разделу работы с файлами
P.S. reset+F1


 
ANB ©   (2007-05-23 16:16) [3]


> Reset(LogFile);

в этом. См. Append а лучше пользуйся системными функциями.


 
Просто_новичок   (2007-05-23 16:16) [4]

Подскажите плиз, а что такое ExtractFilePath(ParamStr(0))?


 
iXT ©   (2007-05-23 16:19) [5]

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

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


 
apic ©   (2007-05-23 16:21) [6]

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


 
{RASkov} ©   (2007-05-23 16:22) [7]

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

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


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

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

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, который находится в той же папке, что и исполняемый модуль программы.
Вот так все работает отлично.


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

> 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:39) [10]

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

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


 
{RASkov} ©   (2007-05-23 16:45) [11]

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

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


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

{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;


 
Loginov Dmitry ©   (2007-05-23 17:05) [13]

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


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

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

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

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


 
ANB ©   (2007-05-23 17:27) [15]


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

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


 
{RASkov} ©   (2007-05-23 17:32) [16]

> [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;


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

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:36) [18]

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

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

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


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

{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:42) [20]

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


> except
> end;

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

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


 
{RASkov} ©   (2007-05-23 17:43) [21]

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

*могу


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

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

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


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

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

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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.06.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.035 c
8-1159775632
Tab
2006-10-02 11:53
2007.06.17
Рисование на Image с помощью gdi+


2-1180334860
JanMihail
2007-05-28 10:47
2007.06.17
Calibr


15-1179751927
Alkid
2007-05-21 16:52
2007.06.17
Хочу спросить пару советов по железу


15-1179590819
@!!ex
2007-05-19 20:06
2007.06.17
Двойной коннект.


3-1174936697
ChainickDenis
2007-03-26 23:18
2007.06.17
Что-то не соображу как запрос сформировать, пожскжите плиз...