![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка ввода/вывода при записи в текстовый файл [D6, XP]
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));
:) Трудно?