Luchfan123 0 / 0 / 0 Регистрация: 29.03.2014 Сообщений: 16 |
||||
1 |
||||
25.05.2014, 12:53. Показов 6234. Ответов 7 Метки нет (Все метки)
Я пишу название файла в первое текстовое поле,нажимаю на кнопку «Создание»,но мне выдает ошибку I/O Error 105.Подскажите,пожалуйста,где здесь ошибка?
0 |
2 / 2 / 0 Регистрация: 25.09.2012 Сообщений: 148 |
|
25.05.2014, 13:18 |
2 |
f:textfile; Вот так надо.
0 |
0 / 0 / 0 Регистрация: 29.03.2014 Сообщений: 16 |
|
25.05.2014, 13:20 [ТС] |
3 |
Не помогает.Выдается та же самая ошибка
0 |
droider 4891 / 2761 / 851 Регистрация: 04.10.2012 Сообщений: 10,062 |
||||||||
25.05.2014, 13:35 |
4 |
|||||||
Либо еще проще
1 |
Luchfan123 0 / 0 / 0 Регистрация: 29.03.2014 Сообщений: 16 |
||||
25.05.2014, 14:01 [ТС] |
5 |
|||
Получилось!Спасибо большое! Добавлено через 22 минуты
В общем пишу функцию,ели файл существует его открыть его,но почему то он у меня создается по-новому,что здесь не так?
0 |
droider 4891 / 2761 / 851 Регистрация: 04.10.2012 Сообщений: 10,062 |
||||
25.05.2014, 16:35 |
6 |
|||
Luchfan123,
1 |
0 / 0 / 0 Регистрация: 29.03.2014 Сообщений: 16 |
|
26.05.2014, 02:22 [ТС] |
7 |
Получилось!А функцию закрытия файла нужно прописать только одной строкой?: CloseFile(f);?Или что то нужно еще добавить?
0 |
пофигист широкого профиля 4658 / 3093 / 854 Регистрация: 15.07.2013 Сообщений: 17,841 |
|
26.05.2014, 02:51 |
8 |
А функцию закрытия файла нужно прописать только одной строкой?: CloseFile(f);?Или что то нужно еще добавить? Одной строки достаточно.
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
26.05.2014, 02:51 |
Помогаю со студенческими работами здесь Error 105 uses I/o error 105
Опять I/O Error 105 uses Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 8 |
I currently have a question for Delphi.Every time when i want to run the program it shows me this problem:Runtime error 105 at 0040423F. Here is the picture of it and the program behind it:
MrTux
32.1k30 gold badges108 silver badges146 bronze badges
asked Nov 20, 2015 at 21:26
Edit your source code to add the line shown below:
program sss;
{$APPTYPE CONSOLE}
[etc]
readln() // <- the program will pause here until you press the Return key
end.
The error you were getting was to tell you your program was being denied access to the standard output stream, which is where the output from a writeln() statement is written, because it isn’t open for output.
answered Nov 20, 2015 at 21:32
MartynAMartynA
30.4k4 gold badges31 silver badges72 bronze badges
4
105 Error is you are doing a «Console Output» in a GUI App!
Also note: Alexandria v11.2 has the same stupid bug!
FASTMM4.PAS is doing a Writeln() — So you should not feel bad, when the developers of the compiler do the same Delphi 101 Error!!
To Embaradero: DUMBASSES!
answered Sep 20, 2022 at 21:29
Ozz NixonOzz Nixon
1491 silver badge7 bronze badges
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan
Страницы: (2) [Все] 1 2 |
Поиск: |
|
Опции темы |
Штабс |
|
||
Unregistered
|
Пипл срочно надо избавиться от этой ошибки код вроде верный try AssignFile(f, FileName); Файл существует IO Error 105 что не так?! |
||
|
|||
Bes |
|
||
Опытный Профиль Репутация: 5
|
Подожди, т.е. теоретически возможна команда ReWrite без Assign-а?… |
||
|
|||
Штабс |
|
||
Unregistered
|
Ой прошу пардону AssignFile(f, FileName); Rewrite() отрабатывает ругань конкретно идет на WriteLn(f,BlaBlaBlaBlaBlaBlaBla) при Reset(f) при пошаговой трассировке F8 напоминаю 105 ошибка это невозможность открыть файл для записи AssignFile(f, FileName) OK структура отработала (т.е. существующий файл получил указатель и открыт для работы) WriteLn(f,BlaBlaBlaBlaBlaBlaBla) IO Error 105 PS кстати аналогичное построение с $I- …. $I+ результат аналогичный |
||
|
|||
Bes |
|
||
Опытный Профиль Репутация: 5
|
Че-то я не пойму: try а почему отрабатывает Rewrite(f) ; т.е. для чтения он открытьсяне может? далее WriteLn(f,BlaBlaBlaBlaBlaBlaBla) Мне кажется но все-таки открывается для чтения и ругается при попытке записать что-либо в него, что вообщем-то естественно. |
||
|
|||
devmstr |
|
||
Developer Профиль
Репутация: 2
|
Если хочешь писать пиши:
[s] ——————— Think different ©Steve Jobs |
||
|
|||
Vit |
|
||
Vitaly Nevzorov Профиль
Репутация: 48
|
f — какого типа? ——————— With the best wishes, Vit |
||
|
|||
Zero |
|
||
Эксперт Профиль
Репутация: 8
|
Собственно по ошибкам в/в, можно исп. дерективы компилятора {$I-} и {$I+}
Имхо, тип здесь не играет особой роли… |
||
|
|||
Vit |
|
||
Vitaly Nevzorov Профиль
Репутация: 48
|
Считаешь что мне делать нечего? ——————— With the best wishes, Vit |
||
|
|||
Vit |
|
||
Vitaly Nevzorov Профиль
Репутация: 48
|
Ошибка в общем-то проста и очевидна, я не зря про тип спрашивал, не совсем был уверен, хотя и догадывался откуда ноги растут, сейчас добрался до Дельфи проверил… Вот код:
Если этот код запустить, и файл ‘c:myfile.txt’ существует, то получим эту самую ошибку 105. Почему? До потому что reset не открывает текстовые файлы на запись! только на чтение. Для записи текстовый файл должен быть открыт только rewrite или append. Вот и все проблемы! ——————— With the best wishes, Vit |
||
|
|||
Bes |
|
||
Опытный Профиль Репутация: 5
|
Об чем и говорим на каждом собрании… |
||
|
|||
Штабс |
|
||
Unregistered
|
Только что вернулся от заказчика…. и так Директивы компилятора {$I} позволяют отлавливать Error Code 105 относится к расширенной таблице ошибок Если этот код запустить, и файл ‘c:myfile.txt’ существует, то получим эту самую ошибку 105. Почему? До потому что reset не открывает текстовые файлы на запись! только на чтение. Для записи текстовый файл должен быть открыт только rewrite или append. Вот и все проблемы! спасибо VIT |
||
|
|||
Vit |
|
||
Vitaly Nevzorov Профиль
Репутация: 48
|
——————— With the best wishes, Vit |
||
|
|||
devmstr |
|
||
Developer Профиль
Репутация: 2
|
Vit ——————— Think different ©Steve Jobs |
||
|
|||
Zero |
|
||
Эксперт Профиль
Репутация: 8
|
Извени Vit, нехотел тебя обидеть, до меня и до самого сразу недошло что от типа многое зависит, покрайней мере в данном случае… Это сообщение отредактировал(а) Zero — 17.12.2004, 23:35 |
||
|
|||
Vit |
|
||
Vitaly Nevzorov Профиль
Репутация: 48
|
——————— With the best wishes, Vit |
||
|
|||
кварк |
|
||
Шустрый Профиль Репутация: нет
|
Извините, что вcтреваю, но зачем Assign? tf: TextFile; {$I-} Rewrite — то же самое. Аррend’у почему-то нужен assign. P.S. Всегда был в этом уверен, только что полез в справку и не нашел упоминаний об этом. Но работает еще с ТР: у меня даже в шаблон это забито P.P.S. Это сообщение отредактировал(а) кварк — 20.12.2004, 14:35 |
||
|
|||
Страницы: (2) [Все] 1 2 |
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
Go Up to Delphi Compiler Errors Index
I/O (input-output) errors cause an exception to be thrown if a statement is compiled in the {$I+}
state. (If the application does not include the System.SysUtils unit, the exception causes the application to terminate).
Handling I/O Errors
In the {$I-}
state, the program continues to execute, and the error is reported by the IOResult function.
I/O Error List
The following table lists all I/O errors, numbers, and descriptions.
Number |
Name |
Description |
100 |
Disk read error |
Reported by Read on a typed file if you attempt to read past the end of the file. |
101 |
Disk write error |
Reported by CloseFile, Write, WriteIn, or Flush if the disk becomes full. |
102 |
File not assigned |
Reported by Reset, Rewrite, Append, Rename, or Erase if the file variable has not been assigned a name through a call to Assign or AssignFile. |
103 |
File not open |
Reported by CloseFile, Read Write, Seek, Eof, FilePos, FileSize, Flush, BlockRead, or BlockWrite if the file is not open. |
104 |
File not open for input |
Reported by Read, Readln, Eof, Eoln, SeekEof, or SeekEoln on a text file if the file is not open for input. |
105 |
File not open for output |
Reported by Write or Writeln on a text file if you do not generate a Console application. |
106 |
Invalid numeric format |
Reported by Read or Readln if a numeric value read from a text file does not conform to the proper numeric format. |
See Also
- Exception Handling
- Resolving Internal Errors (Delphi)
- Delphi Run-Time Errors
- Fatal errors
- Operating system errors
Delphi • Консоль • Программирование • Программистские истории
Недавно я столкнулся с интересным случаем. Ребята из подразделения эксплуатации завели в mantis тикет, описывающий сценарий работы одной из программ, который не укладывался в их понимание правильной картины мира. С моей точки зрения все выглядело немного сумбурно и не очень логично. В общем, опишу немного саму ситуацию и предысторию.
Программа, которая вызвала нарекания, была написана давно, еще на заре автоматизации компании, в которой я сейчас работаю. Она была предназначена, если уж совсем упрощать, для перекладывания файлов. Ну, то есть, пользователи выкладывали файлы в определенные каталоги. Эти файлы надо было обнаружить, систематизировать, основываясь на определенным образом составленных именах файлов, в зависимости от результата систематизации обработать, например, подписать, и выложить на FTP, попутно создав в БД записи об обработанных файлах. Все это делалось для того, чтобы другой софт, используя записи в БД, мог генерировать странички, которые показывались пользователям, и, в случае необходимости, отдавать содержимое с FTP сервера.
Изначально, часть этой работы выполнял shell-скрипт, но, как это обычно и бывает, постепенно возникали все новые и новые «хотелки», и, в конце концов, скрипт переписали на Delphi 6. Заодно, запихали в БД нормативно-справочную информацию и создали программу для работы с ней. Правда, при этом потребовали от этой программы и GUI интерфейс и возможность выполняться в качестве консольного приложения. Дело в том, что программу использовали два типа пользователей: первые — обычные работники, которым нужен был графический пользовательский интерфейс; вторые — сотрудники службы эксплуатации, которые хотели продолжать использовать программу в режиме «малой» автоматизации, примерно так, как раньше использовался shell-скрипт. Этим вторым GUI только мешал. Поэтому автору пришлось пойти на хитрость. Он указал, что приложение является консольным (выставив соответствующую опцию ConsoleApp=1
). И при этом, не стал отказываться от инициализации визуального фреймворка (далее идет код из dpr
файла):
begin
Application.Initialize;
Application.Title := 'Название программы';
Application.CreateForm(TdmMain, dmMain);
Application.CreateForm(TfmMain, fmMain);
Application.Run;
end.
Если при запуске обнаруживались параметры командной строки, на экране не показывались окна, диалоги и другие элементы графического интерфейса, просто в обработчике OnCreate
главной формы выполнялся нужный метод (btnPublish.Click;
) и работа завершалась.
if SilentRun then begin
btnPublish.Click;
WriteToLog('END');
Application.Terminate;
end;
При этом, программа отслеживала возникновение ошибок, и, при их отсутствии, завешалась с кодом 0
, в противном случае, выставляла код 1
. Такая вот задумка.
Но, довольно истории, вернемся к возникающей ошибке, вернее, к ошибкам. Это именно то, что и смущало меня: работники службы эксплуатации сообщали о двух разных ошибках: одна — socket error #11002
, а другая — I/O error 105
. Первая — про невозможность доступа к FTP, вторая — про попытку писать в файл, открытый для чтения. И да, сообщали об этих ошибках разные люди.
Для начала, я решил выяснить, почему одни сотрудники сообщают об обычной ошибке, возникающей при работе с FTP, а другие ссылаются на совершенно другую ошибку, к FTP, скорее всего, отношения не имеющую? После долгих расспросов выяснилось, что каждый из этих сотрудников смотрит в свой лог. Оказалось, что программа ведет три лога: один — в БД, второй (очень похожий на первый по содержанию) ведется в памяти, а по завершении работы отправляется по почте, и третий — ведется в обычном текстовом файле. Так вот, те сотрудники, которые сообщали об ошибке ввода/вывода, смотрели в лог, присланный по почте, а те, которые жаловались на ошибку при работе с FTP, смотрели в лог, ведущийся в текстовом файле.
Тут важно сделать следующее замечание. Основная претензия службы эксплуатации заключалась в том, что, несмотря на возникновение ошибки, программа завершалась самым обычым образом, устанавливая код ошибки (ERRORLEVEL
) в 0
. А так как программа вызывалась из скрипта, который анализировал код завершения, то получалось, что скрипт продолжал работу, как-будто ошибка не происходила вовсе. Хотя и программа и скрипт были расчитаны на то, что при возникновении критических ошибок, работа программы должна была прерываться с кодом 1
.
Ладно, глаза боятся, руки делают — стал я изучать исходный текст, программа-то не моя. Тактика была простой: найти места, выдающие ошибки. Довольно быстро выяснилось, как выдается ошибка работы с FTP. Ошибка возникала практически сразу при старте: делалась попытка подключения к серверу, а так как эксплуатация указала для этого неверные данные, то подключение срывалось, продолжение работы становилось бессмысленным, о чем и сообщалось записью в текстовый лог, после чего выполнение прерывалось вызовом процедуры Delphi Halt(1);
.
...
if SilentRun then
MyHalt('Ошибка подключения к FTP-серверу '+ edtFTPServerTo.Text+':'+#10+e.Message)
else
ErrorBrk('Ошибка подключения к FTP-серверу '+ edtFTPServerTo.Text+':'+#10+e.Message);
...
procedure TfmMain.MyHalt(msg: String);
begin
MyWriteln(msg);
SendMail(resError);
ASP_LogEvent('', cProgName, 'Publish', ASP_logTypeGUI, ASP_logSeverityError, msg, msg, '');
Halt(1);
end;
...
Логика проста и понятна. Но откуда бралось сообщение об ошибке ввода/вывода в логе из электронного письма?
Продолжение исследования выявило тот факт, что такого текста I/O error 105
для логирования ошибок в программе не предусмотрено. Этот факт позволил сделать предположение, что в исходном тексте есть место, которое перехватывает необработанные исключительные ситуации, и логирует их текст «как есть». И действительно, такое место нашлось, и, что самое интересное, после логирования и отправки письма, работа программы не прерывалась вызовом процедуры Halt
, выполнение просто заканчивалось как ни в чем не бывало!
...
except
on e: exception do begin
regexp.Free;
keys.Free;
if IdFTP.Connected then IdFTP.Disconnect;
IdFTP.Free;
if UserCanSign then
CryptoCOM := nil;
ASP_LogEvent('', cProgName, 'Publish', ASP_logTypeGUI, ASP_logSeverityError, e.Message, e.Message, '');
DisableStop;
MemoLog({FormatDateTime('dd.mm.yyyy hh:nn:ss', Now) + ': }'Ошибка: ' + e.Message);
PrintTotals;
SendMail(resError);
end;
end;
...
То есть, был найден источник головной боли эксплуатации — неправильная установка кода завершения программы. Оставалось выяснить, почему вообще дело доходило до этого места, ведь значительно раньше должна была выполниться процедура Halt
.
Код, который производил логирование в текстовый файл, а потом вызывал процедуру Halt
, имел еще одну особенность. Между этими двумя действиями он выводил информацию об ошибке в консоль — обычным writeln
.
...
procedure TfmMain.MyWriteLn(msg: String);
var TextOEM: PChar;
begin
WriteToLog(msg);
GetMem(TextOEM, Length(msg) + 1);
try
CharToOem(PChar(msg), TextOEM);
Writeln(TextOEM);
finally
FreeMem(TextOEM);
end;
end;
...
При этом, вызов этой процедуры осуществлялся только в режиме без GUI — присутствовали все необходимые проверки. То есть, единственным местом, в котором могла возникнуть исключительная ситуация, был вывод в консоль (на самом деле, это, конечно, не единственный возможный источник, но для других выводились бы более явные ошибки). Если бы именно тут и происходила ошибка, то процедура Halt
не выполнялась бы, управление передавалось в блок обработки исключительных ситуаций, там формировалось бы сообщение об ошибке, которое, вместе с остальным журналом работы, и посылалось бы в письме. Идеальный кандидат найден. Теперь осталось понять, что это за зверь такой: ошибка ввода/вывода 105.
Непродолжительный поиск в интернете практически сразу вывел на схожую проблему у одного из пользователей Stack Overflow. Из обсуждения стало понятным, что проблема кроется именно в «двуличной» природе программы — попытка предоставить и GUI интерфейс, и дать возможность работать в качестве обычного консольного приложения, к сожалению, не удалась. Все в соответствии с пословицами и поговорками. Для меня осталось загадкой лишь то, как могла данная ошибка вылезти только что, после стольких лет эксплуатации. Ведь наверняка это был не первый случай проблем с коннектом к FTP серверу. Скорее всего, такие сбои происходили и раньше, но либо в их природе так и не смогли (не захотели?) разобраться, либо просто игнорировали. Либо что-то, все-таки, отличало данный конкретный случай от многих других. Но то нам не ведомо.
Ну и, подводя черту. Понимая, что полной реализации желаемого функционала «два в одном» не получится, я предложил эксплуатации несколько вариантов выхода из сложившейся ситуации. Посмотрим, какой они выберут. Так что, возможно, я еще вернусь к этому интересному случаю и расскажу, чем дело кончилось.
Subscribe to Записки на полях
Get the latest posts delivered right to your inbox
Great! Check your inbox and click the link to confirm your subscription.
Please enter a valid email address!