Форум: "Начинающим";
Текущий архив: 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