Автор Коля Москалёв задал вопрос в разделе Другие языки и технологии
Delphi, работа с файлами и получил лучший ответ
Ответ от Алексей Кузьминов[гуру]
1. Вы используете методы доступа к файлам, которые устарели лет на 15-20, сегодня они используются исключительно в целях обучения.
2. Ошибка, соответствующая строке "File access denied", не документирована. Для Rewrite может быть: запрет создать файл в указанном месте (недостаток прав) , файл уже существует и кем-то открыт. Читайте подробнее описание ошибок функции CreateFile в MSDN, именно она вызывается в конце концов, и именно её ошибки возвращаются
3. "программа будет пытаться читать и писать в файл из нескольких мест, иногда одновременно" - одновременную запись и чтение реализовать практически нереально с помощью таких функций. Из-за того, что файл открывается с неправильными параметрами общего доступа и существует буферизация при чтении данных из файла.
Теоретически можно преобразовать переменную типа файл в структуру TFileRec, подменить Handle на созданный с помощью FileOpen с правильными параметрами совместного доступа, а потом использовать стандартные Pascal-style функции, но зачем? Для низкоуровневого доступа к файлам с совместным доступом используйте FileRead, FileWrite с FileSeek, или на худой конец - TFileStream. Такие файлы очень редко бывают текстовыми.
Алексей Кузьминов
Мыслитель
(9757)
сказав "практически", я имел в виду всего лишь то, что что я знаю способы (несколько способов) реализовать одновременный доступ к файлу/общей памяти с помощью этих функций, но я не смогу объяснить, как это сделать по причинам:
1. займёт много времени
2. отсутствие контроля того, что же вы поняли из рассказанного, и нужно ли вам это
К сожалению, я вынужден понимать вам именно БУКВАЛЬНО.
Команда Rewrite в Delphi для работы с текстовыми файлами не используется. Используй TStringList.
Резет ();
Но лучше использовать потоки.
Проверь из-под отладчика, что имя файла - правильное.
Проверь, что все ок с правами доступа, особенно если файл лежит в папке с программой: попробуй создавать его в моих документах или папке временных файлов.
Проверь, что файл действительно не открыт: в момент ошибки попытайся создать, удалить, скопировать фай любым файл-менеджером типа фара.
Попробуй погуглить код ошибки, который скажет Дельфи, по нему будет видно, что не так с файлом. Если 103 - то файл точно забыли закрыть.
Убедись, что файл не открыт (не залочен) вирусом (антивирусом) .
И таки да, я бы советовал держать содержимое файла в памяти, в том же TSTringList и время от времени тупо сбрасывать его на диск. Если, конечно, файл меньше двух гигов.