Okay, it’s over a year late, but I’m going to add my comment to this, as it explains why this is happening.
I had the exact same problem in a multi-threaded application with code almost identical to the snippet above and I had critical sections protecting the code.
The problem occurred most readily when one logging operation swiftly followed another. The second operation would fail for the above reason.
I thought it was anti-virus software too, but the error happened on one machine and not the other, where both had Norton 360 installed. The machine with the problem was brand new Windows 7 and the one without was Windows XP. A colleague also had the problem running the system under a virtualised Windows Vista machine with no virus checker installed.
So my question was, «why was this XP machine so different?».
For one, it wasn’t virgin, and that is the answer it seems:
Opportunistic locking and NT caching were turned off. Most (mature) Delphi developers will know that when using BDE, these are turned off in order to maintain DBF and DB file integrity in multi-user situations. These settings were not disabled on the newer machines because we no longer develop for Paradox data files!
Delayed write caching seems to leave a read/write lock on the file until the OS has done its business, which could be several milliseconds later.
So, in my case, the second log event was being blocked by the first.
Okay, I’m not suggesting that you turn off opportunistic locking + NT Caching. One of the major reasons we moved away from BDE was to avoid persuading customers to tinker with such settings. So, there are four practical solutions:
1) To retry for an acceptable period of time, as mentioned by dangph.
2) to open the file when the application loads and hold it open for the full duration of the application. Not so useful if you are running multiple instances of the application.
3) Lazily put a sleep(1) before the logging code and hope that is long enough for the lock to be released. But that risks slowing your system down if you are doing lots of logging.
or 4) Put a try…except..end around your code. But then you are probably guaranteed to miss 100% of the second messages (referring to my case).
Почему выскакивает ошибка при обработке файла: IO error 103 ?
var
fall, f1: TextFile;
S: string;
begin
AssignFile(fall, OpenDialog1.FileName);
reset(fall);
if CheckBox1.Checked then
begin
AssignFile(f1, 'Organization.txt');
rewrite(f1);
end;
//работаем по строкам в файле
while not Eof(fall) do
begin
//читаем строку
ReadLn(fall, S);
if CheckBox1.Checked and (Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(s)) > 0) then
writeln(f1, S);
end;
CloseFile(fall);
CloseFile(f1); // <<-- Ошибка выскакивает тут
end;
Kromster
13.2k12 золотых знаков41 серебряный знак70 бронзовых знаков
задан 24 фев 2018 в 17:51
0
Ошибка, с большой долей вероятности, случается потому, что файлы вы открываете на чтение/запись по условию, а вот закрываете файл затем уже в любом случае. Скорее всего, одно из условий:
if CheckBox1.Checked then
if CheckBox2.Checked then
if CheckBox3.Checked then
у вас не выполняется, но при этом CloseFile
вы делаете для всех файлов без условий. Исправьте это, введя те же самые условия и для CloseFile
.
Kromster
13.2k12 золотых знаков41 серебряный знак70 бронзовых знаков
ответ дан 24 фев 2018 в 18:06
Viktor TomilovViktor Tomilov
7,9774 золотых знака22 серебряных знака60 бронзовых знаков
3
if CheckBox1.Checked then
CloseFile(f1);
ответ дан 24 фев 2018 в 18:07
1
dron44rus 0 / 0 / 0 Регистрация: 29.11.2011 Сообщений: 45 |
||||
1 |
||||
19.03.2012, 21:26. Показов 46566. Ответов 8 Метки нет (Все метки)
вот в этой части проекта выдает ошибку IO error 103.Что это и как исправить?
__________________
0 |
Psilon Master of Orion 6094 / 4950 / 905 Регистрация: 10.07.2011 Сообщений: 14,522 Записей в блоге: 5 |
||||
19.03.2012, 21:48 |
2 |
|||
Если не поможет, запускайте через F9 и смотрите, в какой строке вылетает. Если не поймете в какой, то ставьте брекпоинт на начало процедуры и F8-stepover’ом ищите.
0 |
21 / 21 / 4 Регистрация: 30.01.2011 Сообщений: 119 |
|
19.03.2012, 22:11 |
3 |
dron44rus, точно не помню, но rewrite открывает файл, а если файл не существует
0 |
Master of Orion 6094 / 4950 / 905 Регистрация: 10.07.2011 Сообщений: 14,522 Записей в блоге: 5 |
|
19.03.2012, 22:12 |
4 |
Славик___077, ошибаетесь, если файла не существует, то он создается.
0 |
36 / 36 / 8 Регистрация: 10.11.2011 Сообщений: 94 |
|
19.03.2012, 22:20 |
5 |
Psilon, а путь к файлу users’+log+»+log тоже чтоль создается?
0 |
0 / 0 / 0 Регистрация: 29.11.2011 Сообщений: 45 |
|
19.03.2012, 22:23 [ТС] |
6 |
Psilon, а путь к файлу users’+log+»+log тоже чтоль создается? файлы создаются в папке юзеры,которая тоже создается сама.Создается в том же каталоге где и сама программа
0 |
Psilon Master of Orion 6094 / 4950 / 905 Регистрация: 10.07.2011 Сообщений: 14,522 Записей в блоге: 5 |
||||
19.03.2012, 22:27 |
7 |
|||
dron44rus, нет, папка не создается, создается только файл. Поэтому сделайте сначала вызовите
а потом попробуйте опять. (уже без try except.
0 |
dron44rus 0 / 0 / 0 Регистрация: 29.11.2011 Сообщений: 45 |
||||
19.03.2012, 22:37 [ТС] |
8 |
|||
dron44rus, нет, папка не создается, создается только файл. Поэтому сделайте сначала вызовите
а потом попробуйте опять. (уже без try except. не получается.Ну я тебе скинул,надеюсь поможешь.В долгу не останусь
0 |
Master of Orion 6094 / 4950 / 905 Регистрация: 10.07.2011 Сообщений: 14,522 Записей в блоге: 5 |
|
19.03.2012, 23:28 |
9 |
В общем смотри: попробуй при выполнении ДО assignfile сделать пометку в файле. (например, добавить текст или переименовать). Он скажет что «файл занят другим процессом». Поэтому и не работает привязка. Где-то ты не освободил файл.
0 |
Содержание
- Как исправить ошибку I/O 103? Заранее спасибо.
- Delphi IO Error 103
- Related Posts
- Delphi: Почему я иногда получаю ошибку ввода-вывода 103 с этим кодом?
- 12 ответы
- Delphi: Почему я иногда получаю ошибку 103 ввода-вывода с этим кодом?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
Как исправить ошибку I/O 103? Заранее спасибо.
ВОТ небольшой FAQ по этим ошибкам :
1. Что значит H/Д в результате анализа
Ответ: Недоступен сервер. В вычисляемых полях (те, которые используют результаты анализа других полей), это означает, что не хватает данных.
2. Как интерпретируются нечисловые данные в формуле
Ответ: Да в формуле будет 1; Нет, Ошибка, Н/Д, пустое поле — как 0.
3. Я ввел в поле формула неправильную математически формулу. После анализа я получил ошибку. Мне что теперь заново все проверять, чтобы посчитать свою формулу?
Ответ: На вкладке «Обработка» кнопка «Посчитать формулу»
4. При запуске программы вылетает ошибка Read of address: и интерфейс программы не отрисовывается
Ответ: Повреждена БД программы. Чаще всего случается, если биржа или анализируемый сервис подмешал в содержимое один из служебных символов БД. Решение: удалить файл datasource.sdb
5. Как произвести импорт своего списка доноров? (Не с бирж)
Ответ: Создаем текстовый файл, вверху пишем на первой строчке слово «Донор+Tab»
без кавычек и плюча, где [Tab] — Клавиша Tab на клавиатуре. Со следующей строчки списком доноры. По одному на строку. В адресе донора должно присутствовать http://
6. Получил ошибку ‘Отсутсвует доступ к серверу времени. Проверьте подключение к интернету’#13#10’И возможность работы со 123 портом.’ Что это значит?
Ответ: Невозможно найти сервер времени в сети. Попробуйте еще раз через несколько минут. Или обратитесь к провайдеру с просьбой улучшить качество линии и настройки серверов))
7. Когда вылезает информационное окно, Линкматер лезет на передний план. Надоело!
Ответ: Сверните Линкмастер кнопкой _ вверху. Тогда он вылазить не будет. Если вы просто перейдете к другому окну — будет вылизить. Сделано, чтобы вы могли контролировать удаление ссылок например.
8. Я не могу импортировать файл в базу. Постоянно появляется ошибка I/O error 103.
Ответ: Очевидно вы открыли этот файл параллельно в одном из приложений MS Office. Офис использует файлы только в монопольном режиме, поэтому программа не может их прочитать. Закройте приложение MS Office.
9. Как импортировать XAP через файл?
Ответ: К сожалению XAP не предоставляет удобного инструмента экспорта. При клике на кнопках проекта XAP выдает околоссылочный текст и анкор вместе, никак не выделяя что есть что, плюс отсутствует возможность узнать куда ведет ссылка. Единственная возможность провести импорт вручную — следовать следующим шагам:
9.1 В бирже, в разделе Компании нажать кнопку Экспорт всех данных (в нем содержится полный набор необходимой информации).
9.2 Полученный файл сохранить как текстовый.
9.3 Провести фильтрацию этого файла сторонними инструментами (выделить необходимую Вам компанию из всего списка) или внутри программы фильтруя поле Куда ссылается после импорта в программу.
9.4 Провести импорт файла в программу
9.5 Ни в коем случае не удаляйте первую строчку с заголовками колонок, именно по ним программа определяет, что файл именно с XAP.
10. Как считаются беки в Яху, в siteexplorer совсем другая цифра?
Ответ: http://search.yahoo.com/search;_ylt=A0geu7C7G9tGi9UArj6l87UF?fr=sfp&p= +
(linkdomain:[ИМЯ СЕРВЕРА БЕЗ ВВВ] OR linkdomain:[ИМЯ СЕРВЕРА С ВВВ]) -feature:frame -inurl:[ИМЯ СЕРВЕРА БЕЗ ВВВ]
+&iscqry=
То есть исключаем среди беков ретрансляторы содержимого, и внутренние страницы самого сайта, поэтому получается меньше цифра чем через siteexplorer
11. Какое соотношение между ксапами и долларами?
Ответ: 1 доллар = 1000 ксапам в программе
12. Я хочу чтобы у меня было несколько отдельных БД. Как мне это сделать?
Ответ: Вся информация о работе приложения (кроме лицензии) сохраняется рядом с исполняемым файлом Линкмастера. Таким образом, вы можете просто скопировать папку и назвать ее по-другому. Запуская исполняемый файл в соответствующей папке вы фактически обеспечите многопроектную работу.
13. Постоянно получаю Н/Д во всех полях, связанных с индексацией страницы и ссылки. Почему не отображается капча?
Ответ: Очевидно стоит нулевая задержка, в результате че
Источник
Delphi IO Error 103
Similarly to [this], the multithreading in a project has also caused the strange error, which is IO Error 103. It does not happen every time but randomly. I googled a bit and found this poston stackoverflow.
And I started to look into the Delphi code which has the File opening functions using Reset, AssignFile etc. Before, the following function will return the size of a given file.
The problem occurred most readily when one logging operation swiftly followed another. The second operation would fail for the above reason. To solve the IO 103 error, using the IO directive <$I->to suppress the exceptions and <$I+>to turn it on. The variable IOResult indicates that the IO operation is successful if it is zero. For example, the above code could be improved using the IOResult.
The function returns zero if there is an exception in reseting the file. If not, the IO Error 103 will be thrown out. Adding the IO code in the try … except … may suppress the 103 error. <$I+>is identical to <$IOCHECKS ON>and <$I->is the same as <$IOCHECKS OFF>.
If you have this 2343 installation/uninstallation problem that it seems not going away no matter…
If you have encounter the compiler problem [Unspecified Error] in Delphi 2007 on Windows 8…
This post gives a few C++ implementations that fill an array of integers by every…
By Default, the Delphi IDE stores the file information (version) directly in compiled Resource File…
In Delphi, the TFileStream can be used to stream the file reading and writing. Below…
I have raised a purchase order to purchase a license of Delphi XE8 and the…
If you want to get the file size in bytes for a file, you can…
Embarcadero has just released Delphi 10.1 Berlin on 20/April/2016. The CompilerVersion for Delphi 10.1 Berlin…
Tasks / Threads created by TParallel are more or less persistent which might be good…
Recently I am involved in optimising the Delphi code for I/O file access. I found…
Источник
Delphi: Почему я иногда получаю ошибку ввода-вывода 103 с этим кодом?
В нескольких моих приложениях у меня есть код, подобный следующему:
В одном приложении, когда я впервые пытаюсь выполнить это, я постоянно получаю исключение I / O Error 103 в строке с оператором Append (файл существует до вызова этого). Однако все последующие попытки выполнить операцию будут работать нормально — до тех пор, пока я не перезапущу приложение.
Все документы, которые я нашел об этой ошибке до сих пор, указывали, что это может быть вызвано вызовом CloseFile без предварительного Reset or Rewrite ( Append обычно не упоминается) или если файл использовался другим процессом. Поскольку исключение происходит до вызова CloseFile очевидно, что это не могло быть первым.
Я уже пробовал вставить Reset сразу после AssignFile для хорошей меры, но тогда я получаю исключение в этой строке.
Также нет другого приложения, открыто обращающегося к этому файлу. Я говорю «открыто», потому что у меня есть небольшое подозрение, что антивирус (в моем случае TrendMicro) может быть причиной проблемы (так что, возможно, файл is в использовании). Если это действительно проблема, как лучше всего ее решить? Жесткое кодирование автоматической повторной попытки на самом деле не кажется мне простым решением .
Другой случай, когда я иногда получаю ошибку 103, — это код, который я использую для создания пустого файла (или, чаще, для очистки существующего файла):
В этом случае воспроизвести гораздо сложнее. Это случается намного реже. В большинстве случаев это происходит при первом запуске после того, как я перекомпилировал приложение. Неужели это снова мешает антивирус? Я видел это только на моей машине разработки и никогда не получал отчета от клиента. Как и в первом сценарии, это происходит только один раз за сеанс приложения (если вообще). Последующие попытки всегда успешны.
Есть ли предложения по другому, потенциально более надежному подходу к созданию пустых файлов или очистке существующих?
задан 11 марта ’09, 11:03
12 ответы
Я не вижу, что не так с автоматической повторной попыткой. Я не думаю, что ты можешь делать что-то еще. Если какой-то другой процесс читает файл, то ваше добавление / перезапись завершится ошибкой. А поскольку файл представляет собой журнал, есть большая вероятность, что что-то, например средство просмотра журнала или текстовый редактор, будем читать его в тот момент, когда вы пытаетесь его открыть.
Попробуйте открыть файл несколько раз с задержкой между попытками, прежде чем окончательно потерпите неудачу. Вы можете использовать экспоненциальную отсрочку, если хотите быть фантазией.
ответ дан 12 мар ’09, в 03:03
Хорошо, уже больше года с опозданием, но я собираюсь добавить свой комментарий к этому, поскольку он объясняет, почему это происходит.
У меня была точно такая же проблема в многопоточном приложении с кодом, почти идентичным приведенному выше фрагменту, и у меня были критические секции, защищающие код.
Проблема чаще всего возникала, когда одна операция регистрации быстро следовала за другой. Вторая операция не удалась бы по вышеуказанной причине.
Я думал, что это тоже антивирус, но ошибка произошла на одной машине, а не на другой, где на обоих был установлен Norton 360. На машине с проблемой была совершенно новая Windows 7, а на машине без нее — Windows XP. У коллеги также была проблема с запуском системы на виртуализированном компьютере с Windows Vista без установленной антивирусной программы.
Итак, мой вопрос был: «Почему эта машина с XP так отличалась от других?».
Во-первых, это не было девственницей, и, похоже, это ответ:
Были отключены оппортунистическая блокировка и кеширование NT. Большинство (зрелых) разработчиков Delphi знают, что при использовании BDE они отключены, чтобы поддерживать целостность файлов DBF и DB в многопользовательских ситуациях. Эти настройки не были отключены на новых машинах, потому что мы больше не разрабатываем файлы данных Paradox!
Кэширование с отложенной записью, похоже, оставляет блокировку чтения / записи для файла до тех пор, пока ОС не выполнит свою работу, что может произойти через несколько миллисекунд.
Итак, в моем случае второе событие журнала было заблокировано первым.
Хорошо, я не предлагаю вам отключить гибкую блокировку + кеширование NT. Одна из основных причин, по которой мы отошли от BDE, заключалась в том, чтобы не уговаривать клиентов возиться с такими настройками. Итак, есть четыре практических решения:
1) Чтобы повторить попытку в течение приемлемого периода времени, как указано в дангф.
2) открывать файл при загрузке приложения и держать его открытым в течение всего времени работы приложения. Не очень полезно, если вы запускаете несколько экземпляров приложения.
3) Лениво положите сон (1) перед кодом регистрации и надейтесь, что этого достаточно для снятия блокировки. Но это рискует замедлить работу вашей системы, если вы ведете много журналов.
или 4) Попробуйте . за исключением . завершите свой код. Но тогда вы, вероятно, гарантированно пропустите 100% вторых сообщений (в моем случае).
Источник
Delphi: Почему я иногда получаю ошибку 103 ввода-вывода с этим кодом?
В нескольких моих приложениях у меня есть код, похожий на следующий:
В одном приложении, в первый раз, когда я пытаюсь выполнить это, я последовательно получаю исключение 103 ошибки ввода-вывода в строке с оператором Append (файл существует до вызова этого). Все последующие попытки операции будут работать нормально — пока я не перезапущу приложение.
Все документы, которые я нашел об этой ошибке, указали, что это вызвано вызовом CloseFile без предшествующих Reset или Rewrite ( Append обычно не упоминается) или если файл находился в использование другим процессом. Поскольку исключение происходит до вызова CloseFile , оно, очевидно, не может быть первым.
Я уже пробовал вставить Reset сразу после AssignFile для хорошей меры, но затем я получаю исключение в этой строке.
Также нет другого приложения, открыто доступного для этого файла. Я говорю «открыто», потому что у меня есть небольшое подозрение, что антивирус (TrendMicro в моем случае) может быть куклитом здесь (так что, возможно, используется файл ). Если это действительно проблема, что было бы лучше всего вокруг нее? Жесткое кодирование автоматической повторной попытки на самом деле не похоже на чистое решение для меня.
Другим случаем, когда я иногда получаю ошибку 103, является этот код, который я использую для создания пустого файла (или чаще всего для удаления существующего файла):
В этом случае это намного сложнее воспроизвести. Это происходит гораздо реже. В большинстве случаев это похоже на первый запуск после того, как я перекомпилировал приложение. Может ли это снова стать антивирусом? Я только когда-либо видел это на моей машине разработки и никогда не получал отчет от клиента. Как и в случае с первым сценарием, это всегда случается один раз на один сеанс приложения (если вообще). Последующие попытки всегда успешны.
Любые предложения по другому, потенциально более безопасному подходу к созданию пустых файлов или опорожнению существующих?
ОТВЕТЫ
Ответ 1
Я не вижу, что не так с автоматической попыткой. Я не вижу, что ты можешь сделать что-нибудь еще. Если какой-либо другой процесс читает файл, то ваш Append/Rewrite завершится с ошибкой. И поскольку файл является журналом, есть хорошая вероятность, что что-то, например, просмотрщик журналов или текстовый редактор, будет читать его в тот момент, когда вы попытаетесь его открыть.
Попробуйте открыть файл несколько раз с задержкой между попытками до окончательного завершения. Вы можете использовать экспоненциальный откат, если хотите, чтобы вы были фантазии.
Ответ 2
Хорошо, это на год, но я собираюсь добавить свой комментарий к этому, потому что это объясняет, почему это происходит.
У меня была такая же проблема в многопоточном приложении с кодом, почти идентичным фрагменту выше, и у меня были критические разделы, защищающие код.
Проблема произошла наиболее легко, когда одна операция регистрации быстро последовала за другой. Вторая операция потерпит неудачу по вышеуказанной причине.
Я думал, что это тоже антивирусное программное обеспечение, но ошибка произошла на одном компьютере, а не на другом, где оба были установлены Norton 360. Машина с проблемой была совершенно новая Windows 7, а одна без Windows XP. У коллеги также возникла проблема с запуском системы под виртуализированной машиной Windows Vista без установленного антивируса.
Итак, мой вопрос: «Почему эта машина XP была такой разной?».
Во-первых, он не был девственником, и это ответ кажется:
Оппортунистическая блокировка и кэширование NT были отключены. Большинство (зрелых) разработчиков Delphi будут знать, что при использовании BDE они отключены, чтобы поддерживать целостность файлов DBF и DB в многопользовательских ситуациях. Эти настройки не были отключены на новых машинах, потому что мы больше не разрабатываем файлы данных Paradox!
Отложенное кэширование записи, похоже, оставляет блокировку чтения/записи в файле до тех пор, пока ОС не выполнит свою работу, и это может быть несколько миллисекунд позже.
Итак, в моем случае второе событие журнала блокировалось первым.
Хорошо, я не предлагаю отключить оппортунистическую блокировку + NT Caching. Одна из основных причин, по которым мы отошли от BDE, заключалась в том, чтобы избежать убеждения клиентов возиться с такими настройками. Итак, есть четыре практических решения:
1) Повторить попытку в течение приемлемого периода времени, как указано dangph.
2), чтобы открыть файл, когда приложение загружается и удерживает его открытым в течение всего срока действия приложения. Не очень полезно, если вы используете несколько экземпляров приложения.
3) Летите положить спать (1) перед кодом регистрации и надеяться, что это достаточно долго, чтобы блокировка была выпущена. Но это может замедлить работу вашей системы, если вы делаете много протоколирования.
или 4) Положите попытку. кроме.. вокруг вашего кода. Но тогда вам, вероятно, гарантированно пропустите 100% вторых сообщений (со ссылкой на мой случай).
Ответ 3
Помимо антивируса, он также может быть индексирующим программное обеспечение или программное обеспечение для управления файлами, например, Google Desktop. Однако настоящая проблема заключается в том, что сообщение об ошибке не поможет вам решить проблему. Я предлагаю вам переписать код для использования TFileStream, вместо этого, чтобы улучшить ваши сообщения об ошибках.
Ответ 4
Обычно вы должны открыть файл перед попыткой try..finally:
(попробуйте, наконец, не имеет никакого смысла в последнем случае)
В противном случае закрытие файла может завершиться неудачно, потому что оно не может быть открыто, и это замаскирует реальную ошибку.
Но я не думаю, что это проблема.
Ответ 5
Является ли ваше приложение многопоточным? У меня когда-то была такая же проблема, как и при одновременном вызове кода регистрации из обоих потоков. Если это так, используйте TCriticalSection для контроля доступа.
Ответ 6
Не могли бы вы взглянуть на блуждающую ошибку из чего-то еще, скомпилированного в состоянии $I?
Ответ 7
Ваш примерный код должен работать вообще, эти ошибки, похоже, являются ошибками доступа. Чтобы обнаружить случай этого, вы можете попытаться отключить TrendMicro и посмотреть, не исчезла ли проблема.
Ответ 8
Если я правильно понимаю, ваше назначение файла не выполняется. Вы уверены, что FileChecks находятся во время вызова AssignFile? Это довольно необычно, но вы можете проверить это, используя:
Я соглашаюсь использовать TFileStream (или что-то вроде функции доступа к низкоуровневому файлу). Это критично для производительности и может стать огромной проблемой при переходе на Unicode.
Ответ 9
Я ненавижу Windows. вижу, почему:
Это код, который решает проблему ReWrite (без сообщений):
Да, это абсурдно. если ReWrite терпит неудачу, сделайте Rewrite. но он работает для меня в 100% случаев.
Я ДЕБЮГ, что проблема, связанная с большим количеством ShowMessage. была немного фантазии после попытки не абсурдных вещей (файл был ранее открыт и т.д.). что произойдет, если я попробую ReWrite дважды? Сюрприз. если первый провал, вторая попытка срабатывает!
Я знаю, что это абсурд, но он работает!
Я знал это, потому что я писал много сообщений, например:
И я получил две сообщения:
- 1,2,3,4 при работе fisrt rewrite
- 1,2,3,5,6, когда переписывание fisrt не выполняется, обратите внимание, что существует 6, поэтому вторая перезапись работала
Надеюсь, что это поможет другим, не настолько безумным.
P.D.: Такая же проблема возникает с Reset. теперь я всегда инкапсулирую их в такую попытку. кроме блока и избавлюсь от проблемы!
Ответ 10
Привет. Возможно, слишком поздно для ответа на исходный вопрос, но я хочу добавить свою часть, и, несмотря на то, что это не прямой ответ на исходный вопрос, я хочу внести свой вклад, поскольку я думаю, что это может помочь некоторым другим, кто ищет такой вид ответа.
У меня получился такой же ответ на ошибку, но в полнофункциональном программном обеспечении, в частности, анализаторе EIS, больше раз я пытался открыть файл, но через некоторое время его можно было открыть. Мне это было любопытно, поэтому я схватился за интернет. И действительно, как маловероятно, казалось (потому что значимая программа довольно мала), я нашел такой вызов ошибки. Я снимал эти ответы, и тот, у которого есть две проверки с зеленым чеком, я сразу последовал, просто интуитивно, и это так: Когда я открыл файл в другой программе, он не позволит мне перейти к откройте его как файл в анализаторе EIS.
Итак, общий вывод: когда вы открыли файл в одной программе, он не позволит вам открывать его где-нибудь еще, и вы получите сообщение об ошибке ввода/вывода ошибки 103.
PS: Немного смелый и лёгкий и легкий вывод (без правильного чтения (но у меня нет времени, извините) вышеупомянутые ответы), но я надеюсь, что у вас есть точка.:) Приветствия.
Ответ 11
Я случайно сделал CloseFile дважды и имел эту ошибку.
Источник
Similarly to [this], the multithreading in a project has also caused the strange error, which is IO Error 103. It does not happen every time but randomly. I googled a bit and found this poston stackoverflow.
And I started to look into the Delphi code which has the File opening functions using Reset, AssignFile etc. Before, the following function will return the size of a given file.
function getFileSizeInBytes(const fn: string): integer; var f: File of byte; begin Result := -1; if (FileExists(fn)) then begin try AssignFile(f, fn); Reset(f); Result := FileSize(f); finally CloseFile(f); end; end; end;
The problem occurred most readily when one logging operation swiftly followed another. The second operation would fail for the above reason. To solve the IO 103 error, using the IO directive {$I-} to suppress the exceptions and {$I+} to turn it on. The variable IOResult indicates that the IO operation is successful if it is zero. For example, the above code could be improved using the IOResult.
function getFileSizeInBytes(const fn: string): integer; var f: File of byte; begin Result := -1; if (FileExists(fn)) then begin try {$I-} AssignFile(f, fn); Reset(f); {$I+} if (IOResult = 0) then begin Result := FileSize(f); end else begin Result := 0; end; finally CloseFile(f); end; end; end;
The function returns zero if there is an exception in reseting the file. If not, the IO Error 103 will be thrown out. Adding the IO code in the try … except … may suppress the 103 error. {$I+} is identical to {$IOCHECKS ON} and {$I-} is the same as {$IOCHECKS OFF}.
–EOF (The Ultimate Computing & Technology Blog) —
GD Star Rating
loading…
331 words
Last Post: Using DocStrings in Python
Next Post: Dropbox Provides Light-weight FTP space
The Permanent URL is: Delphi IO Error 103 (AMP Version)
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 #io
Почему выскакивает ошибка при обработке файла: IO error 103 ? var fall, f1: TextFile; S: string; begin AssignFile(fall, OpenDialog1.FileName); reset(fall); if CheckBox1.Checked then begin AssignFile(f1, 'Organization.txt'); rewrite(f1); end; //работаем по строкам в файле while not Eof(fall) do begin //читаем строку ReadLn(fall, S); if CheckBox1.Checked and (Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(s)) > 0) then writeln(f1, S); end; CloseFile(fall); CloseFile(f1); // <<-- Ошибка выскакивает тут end;
Ответы
Ответ 1
if CheckBox1.Checked then CloseFile(f1);
Ответ 2
Ошибка, с большой долей вероятности, случается потому, что файлы вы открываете на чтение/запись по условию, а вот закрываете файл затем уже в любом случае. Скорее всего, одно из условий: if CheckBox1.Checked then if CheckBox2.Checked then if CheckBox3.Checked then у вас не выполняется, но при этом CloseFile вы делаете для всех файлов без условий. Исправьте это, введя те же самые условия и для CloseFile.