Моя проблема такова: при попытке открыть текстовый файл при помощи команды Rewrite, и если он (файл) существует по указанному в AssignFile пути, то происходит исключение "File access denied".
Как исправить ?
При этом файл нигде больше не открыт, что я знаю абсолютно точно.
P.S. Если файла не существует, то команда Rewrite нормально его (файл) создаёт и открывает.
Другие языки программирования и технологии
Delphi, работа с файлами
1. Вы используете методы доступа к файлам, которые устарели лет на 15-20, сегодня они используются исключительно в целях обучения.
2. Ошибка, соответствующая строке "File access denied", не документирована. Для Rewrite может быть: запрет создать файл в указанном месте (недостаток прав) , файл уже существует и кем-то открыт. Читайте подробнее описание ошибок функции CreateFile в MSDN, именно она вызывается в конце концов, и именно её ошибки возвращаются
3. "программа будет пытаться читать и писать в файл из нескольких мест, иногда одновременно" - одновременную запись и чтение реализовать практически нереально с помощью таких функций. Из-за того, что файл открывается с неправильными параметрами общего доступа и существует буферизация при чтении данных из файла.
Теоретически можно преобразовать переменную типа файл в структуру TFileRec, подменить Handle на созданный с помощью FileOpen с правильными параметрами совместного доступа, а потом использовать стандартные Pascal-style функции, но зачем? Для низкоуровневого доступа к файлам с совместным доступом используйте FileRead, FileWrite с FileSeek, или на худой конец - TFileStream. Такие файлы очень редко бывают текстовыми.
2. Ошибка, соответствующая строке "File access denied", не документирована. Для Rewrite может быть: запрет создать файл в указанном месте (недостаток прав) , файл уже существует и кем-то открыт. Читайте подробнее описание ошибок функции CreateFile в MSDN, именно она вызывается в конце концов, и именно её ошибки возвращаются
3. "программа будет пытаться читать и писать в файл из нескольких мест, иногда одновременно" - одновременную запись и чтение реализовать практически нереально с помощью таких функций. Из-за того, что файл открывается с неправильными параметрами общего доступа и существует буферизация при чтении данных из файла.
Теоретически можно преобразовать переменную типа файл в структуру TFileRec, подменить Handle на созданный с помощью FileOpen с правильными параметрами совместного доступа, а потом использовать стандартные Pascal-style функции, но зачем? Для низкоуровневого доступа к файлам с совместным доступом используйте FileRead, FileWrite с FileSeek, или на худой конец - TFileStream. Такие файлы очень редко бывают текстовыми.
Команда Rewrite в Delphi для работы с текстовыми файлами не используется. Используй TStringList.
Проверь из-под отладчика, что имя файла - правильное.
Проверь, что все ок с правами доступа, особенно если файл лежит в папке с программой: попробуй создавать его в моих документах или папке временных файлов.
Проверь, что файл действительно не открыт: в момент ошибки попытайся создать, удалить, скопировать фай любым файл-менеджером типа фара.
Попробуй погуглить код ошибки, который скажет Дельфи, по нему будет видно, что не так с файлом. Если 103 - то файл точно забыли закрыть.
Убедись, что файл не открыт (не залочен) вирусом (антивирусом) .
И таки да, я бы советовал держать содержимое файла в памяти, в том же TSTringList и время от времени тупо сбрасывать его на диск. Если, конечно, файл меньше двух гигов.
Проверь, что все ок с правами доступа, особенно если файл лежит в папке с программой: попробуй создавать его в моих документах или папке временных файлов.
Проверь, что файл действительно не открыт: в момент ошибки попытайся создать, удалить, скопировать фай любым файл-менеджером типа фара.
Попробуй погуглить код ошибки, который скажет Дельфи, по нему будет видно, что не так с файлом. Если 103 - то файл точно забыли закрыть.
Убедись, что файл не открыт (не залочен) вирусом (антивирусом) .
И таки да, я бы советовал держать содержимое файла в памяти, в том же TSTringList и время от времени тупо сбрасывать его на диск. Если, конечно, файл меньше двух гигов.
Олег Маматов
Я держу содержимое файла в в обычном string'е, и при возникновении какого то из прописанных в коде событий происходит сброс данных на диск.
Резет ();
Но лучше использовать потоки.
Но лучше использовать потоки.
Олег Маматов
В моём случае программа будет пытаться читать и писать в файл из нескольких мест, иногда одновременно, поэтому с потоком будет тяжело.
Но как я сказал, Rewrite генерит denied даже тогда, когда нет параллельного доступа.
Ну и да, вытяжка из интернет-справочника:
Если файл не существует, то он будет создан.
Если файл уже существует, содержание будет потеряно, и новые данные добавятся в начало.
http://www.delphibasics.ru/ReWrite.php
Второй пункт не выполнен
Но как я сказал, Rewrite генерит denied даже тогда, когда нет параллельного доступа.
Ну и да, вытяжка из интернет-справочника:
Если файл не существует, то он будет создан.
Если файл уже существует, содержание будет потеряно, и новые данные добавятся в начало.
http://www.delphibasics.ru/ReWrite.php
Второй пункт не выполнен
Похожие вопросы
- С/C++ работа с файлами, удаление и вывод на экран заранее не известных файлов
- Программирование С++(работа с файлами) Подробное описание
- Работа с файлами. PascalABC.
- С++ работа с файлами, как достать отдельно слова из файла
- Работа с файлами в АССЕМБЛЕРЕ. Надо считывать файл, путь указывает пользователь при запуске программу. Помогите!
- Помогите пожалуйста. Язык Си работа с файлами
- Примитивная работа с файлами. PASCAL.
- С++ ПРОГРАММИРОВАНИЕ. работа с файлами
- Программирование на C++.Работа с файлами.
- Сохранение из StringGrid в файл и загрузка из файла - Delphi
"... одновременную запись и чтение реализовать практически нереально с помощью таких функций ..."
В этом выражении ключевое слово "практически". Кто сказал, что запись/чтение будет происходить в БУКВАЛЬНОМ смысле одновременно? Даже "многозадачное" ядро процессора не является многозадачным, как таковым, а лишь выполняет очередь операций с учётом приоритета по времени, и делает это оЧень быстро.
(которую команда try отловит на команду except, без описания ошибки) , то логическая переменная примет значение ЛОЖЬ (сразу после строки except), и по этой логической переменной произойдёт переход в начало цикла с постусловием (repeat находится перед try). И так до тех пор, пока кто то, кто вызвал функцию записи в файл, не закроет файл - будет выполняться этот цикл. Таким образом я реализовал ту самую "параллельность" записи. "Очередь задач" не напоминает ?
Как я решил свою проблему, о которой написал в вопросе: опять же try, в случае исключения файл будет удалён, и после чего всё равно выполнится команда Rewrite(); ведь эта команда по идее должна создать новый файл? А я писал (опять же, в вопросе) , что если файла не существует - то команда Rewrite выполняется удачно.
Всё через жопу (а кто сказал, что будет легко ?), но работает.
Ну и в примечание:
"... сегодня они используются исключительно в целях обучения ...". По этому поводу скажу вот что: я пишу курсовую работу, и мне плевать на эти ваши "новые методы" доступа к фалам.