Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.044 c
1-1176984924
Диамонд
2007-04-19 16:15
2007.06.17
Передача параметров в процедуру или функцию


15-1179915575
DiamondShark
2007-05-23 14:19
2007.06.17
Ахтунг в госдуме


1-1176996961
Dmitry_177
2007-04-19 19:36
2007.06.17
Копия запущенной программы


3-1175081570
Xmen
2007-03-28 15:32
2007.06.17
Обновление данных у Клиента


2-1180394288
vasIZmax
2007-05-29 03:18
2007.06.17
Как нарисовать пружину?))





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский