|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Событие "файл занят для записи" в Delphi/Lazarus
Регистрация: 09.12.2008
Сообщений: 4,643
|
||
Просмотров: 9983
|
|
||||
YngIngKllr Регистрация: 29.03.2005
СПб
Сообщений: 12,968
|
А не лучше ли создавать БД и с ней работать...
А по части чтения надо использовать FileExists, если файл существует, но пользователь не имеет прав на его просмотр, то будет возвращено False. Вопросы по Лазарю, лучше тут задавать или тут...
__________________
Работаю за еду. Working for food. Für Essen arbeiten. العمل من أجل الغذاء Працую за їжу. |
|||
![]() |
|
||||
@ETCartman
Можно конечно и на форуме домохозяек задавать вопросы о Delphi/Lazarus, однако всё же разумнее это делать на специализированных форумах (если ты действительно заинтересован в том, чтобы получить качественный ответ). По теме: приложение, которое должно читать полученный результат, может самостоятельно запустить др. приложение, которое будет формировать файл. Как только запущенный процесс будет завершён, программа может продолжить работу, считывая сгенерированный файл. В этом-то какая сложность?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 20.03.2013 в 08:55. |
||||
![]() |
|
||||
Регистрация: 09.12.2008
Сообщений: 4,643
|
ну насчет домохозяек это напрасно. хотя я конечно попробую задать на спец. форуме если не получится
вот тут пример. если не нажимать open - файл читается. если нажать - нет. даже закрыть его без ошибки нельзя. скорее всего я где то напортачил.
__________________
мой блог по некоторым вопросам |
|||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Не здесь надо спрашивать. Решения легко находятся поиском по ReadDirectoryChanges - это специальная функция WinAPI. Применить её не так просто, но примеры есть. Легко найдутся.
Никакого "события" или "свойства" отркытости в Delphi/Lasarus, естественно, нет. Но есть замечательная конструкция try.... except...end. Она предназначена как раз для предотвращения ошибок. Т.е. поместив действие с файлом, при котором может произойти ошибка в "ловушку", как раз и предотвращаем последствия. Код:
Надо учитывать, что совсем не обязательно файл, в который кто-то пишет, может быть недоступен. Это зависит от программы, которая его открыла. Например Notepad++ не блокирует открытые им файлы, в них можно писать. Но он следит, не изменился ли файл. А другие программы блокируют. Для серьезной работы лучше пользоваться приличными библиотеками. Для Delphi просто обязательны бесплатная Jedi (JCL + JVCL). Там найдется 90% всех необходимых визуальных компонент и модулей на все случаи жизни любителя. В том числе для грамотной работы с файлами. Когда посмотришь, как люди в течение многих лет работают над казалось бы простыми действиями (например скопировать файл), понимаешь разницу между самоделкинским и профессиональным кодированием. Для совсем серьезной работы с файловой системой лучше всего использовать библиотеки VirtualShellTools от Mustangpeak. Там есть всё - и визуальное и невизуальное. Пример NamespaceBrowser показывает, сколько интимных подробностей можно узнать про любой файл. |
|||
![]() |
|
||||
Offtop: Любопытства ради: влияет ли в Delphi данная конструкция на скорость работы приложения, в случае частого возникновения исключений? Если влияет, то насколько сильно? Например, в .NET за возможность обработки исключений приходится платить существенным снижением скорости работы приложения (в случае частого возникновения Exception).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Thượng Tá Quân Đội Nhân Dân Việt Nam Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372
|
Цитата:
Применять надо там, где предугадать ошибку невозможно. Например, при обращении к БД могут быть всякие сбои, никак от программы не зависящие (да связь разорвалась) - тут обязательно надо предусматривать. Если для Connection установлен timeout, так и тормозить будет сильно. Но я не замечаю вообще ощутимых торможений в своих программах, хоть ловушки часто ставлю. Просто они редко срабатывают. Еще зависит и от того, что в except...end записано. |
|||
![]() |
|
||||
Регистрация: 14.03.2013
Сообщений: 9
|
А может тогда проще сделать, если файл нужен только на чтение, проверить есть ли он, и скопировать под другим именем.
Дальше произвести все необходимые действия и сохранить под другим именем, насколько я понимаю, ETCartman делает какой то конвертер... |
|||
![]() |
|
||||
Offtop: Помнится когда-то сравнивал результаты итераций различными способами по базе данных чертежа, содержащей 736 323 примитива. Один из вариантов был с обработкой исключений (самый долгий), второй - через PInvoke (средний по скорости) и третий - без возникновения исключений (самый быстрый). Разница была колоссальной (результаты здесь).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
ETCartman
1. Стоит забыть о доступе к файлам через файловые переменные. Используйте FileOpen\FileClose и доступ к файлу по хэндлу (по хендлу возвращаемому FileOpen понятно открылся файл или нет) или потоки. 2. Ошибка у вас в коде изза повторного открытия незакрытого файла - Button2Click оставляет файл открытым, все остальные процедуры перед своими действиями пытаются повторно открыть файл. Нормальная практика работы с файлом: открыл-прочитал\записал-закрыл, ненадо его постоянно открывать\закрывать и размазывать открытие и закрытие по разным кускам кода. hwd >>Разница была колоссальной (результаты здесь). конечно try/except замедляет код и пользовать его стоит для "глобальных" действий, а не заворачивая каждую "элементарную" операцию отдельно. |
|||
![]() |
|
||||
Цитата:
![]()
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Нет, просто достаточно подумать немного и сразу станет понятно почему обозначенное заявление неверно.
![]()
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
YngIngKllr Регистрация: 29.03.2005
СПб
Сообщений: 12,968
|
zamtmn
У него файл открыт в совершенно другой проге, он делает конвертер...... Вот он и хочет получать из него актуальную инфу... Проще всего наверное сохранить в той проге в которой он работает, и дальше запускать и считывать информацию своей прогой... Файл при этом наверное все таки лучше скопировать и прочитать...
__________________
Работаю за еду. Working for food. Für Essen arbeiten. العمل من أجل الغذاء Працую за їжу. |
|||
![]() |
|
||||
Ну давай... Конкретный пример, варианты решения которого я показывал по ссылке: нужно получить валидные идентификаторы всех не удалённых объектов базы данных чертежа. Предположим, что в нашем арсенале нет недокументированного метода Database.TryGetObjectId, а так же нет возможности воспользоваться P/Invoke. Однако на руках имеется документированный метод Database.GetObjectId, который позволяет получить ObjectId на основе Handle, если для указанного хэндла идентификатор существует, иначе - генерируется исключение. Думай, с помощью каких глобальных" действий ты решишь эту задачу? Мой вариант решения ты знаешь.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Нет. так думать я немогу, т.к. по ссылке не ходил и .нет не умею.
я всего лишь имел ввиду что лучше Код:
Код:
Описаное тобой - попытка использовать обработку ошибок как возврат значения из функции - может и оправданный способ в рамках отсутствия функций и недокументированности API, но по сути частный случай и стрельба по пушкам из воробъев)) Последний раз редактировалось zamtmn, 20.03.2013 в 22:18. |
|||
![]() |
|
||||
Цитата:
Мораль здесь проста: try\catch нужно использовать не по принципу "глобальных действий", и не по принципу " заворачивания каждой элементарной операции", а определять это исходя их конкретных случаев, ориентируясь на получение корректного результата (в приоритете).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
hwd
Моя мораль не сложнее: обработку ошибок нужно использовать для обработки ошибок, остальное - от лукавого, хотя иногда приходится выкручиваться. В описаном случае надо требовать у автодеска чтоб Database.GetObjectId в случае отсутствия примитива возвращал какойнибудь EObjectIdInvalid или задокументировать предназначенную для этого недокументируемую функцию. Привиденные мной куски псевдокода кода к решаемой тобой задаче не имеют отношения, это просто пример |
|||
![]() |
|
||||
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |