![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как узнать открыт файл или нет?
umbra © (2005-09-21 12:17:00)Я подозреваю, что это довольно частый вопрос, но поиском ничего не нашел. Как при доступе к файлу определить открыт ли он уже каким либо процессом (приложением) или нет? Намекните, пожалуйста
Fay (2005-09-24 02:44:00) [1]2 ANB © (23.09.05 17:05) [40]
>> с учетом того, что из управляещей проги нет доступа к WinAPI
Это как?!
Мексиканец (2005-09-24 00:47:00) [2]umbra © (23.09.05 14:43) [31]
>ну, к примеру, есть две проги, одна пишет в файл, другая из него читает.
>запускаются автоматически, интервалы между запусками изменяющиеся. А
>читать надо только после того, как все записано
В виндовс каждая софтина для которой важно иметь монопольный доступ к файлу, должна выставить соответствующие атрибуты, тогда другая софтина просто не сможет прочитать файл пока та софтина не закончит с ним работу и не освободит его. Все просто. Не думаю что здесь есть почва для творчества.
>Или например, при запуске проги надо убедиться, что это первый ее
>екземпляр.
ИМХО строить решение данной задачи на файле, не стоит.
Мексиканец (2005-09-24 00:27:00) [3]Не пойму чем не нравится такая конструкция?
hFile:= CreateFile();
if hFile = -1 then
case GetLastError() of
...
end;
Если можно объясните? Тем более что можно точно узнать причину по которой файл открыть не удалось. У меня, где-то была таблица значения возвращаемых значений, будет время, найду и кину сюда.
ANB (2005-09-23 17:05:00) [4]
> Или например, при запуске проги надо убедиться, что это
> первый ее екземпляр.
- это делается намного проще. А вот конкретный пример из реального проекта :
Есть консольная прога (текстовый режим, никаких окон), она время от времени отвечает на звонки по модему и складывает ответ в файл. Другая прога должна прочитать этот файл только, когда он не занят (в него не пишут). Повторное чтение неизмененного файла уже обработано и некритично. Вот таким способом и сделано - каждая из прог открывает файл в монопольном режиме и если не получается - ждет, пока получится. Хотя я бы сам, имхо, сделал бы по другому, но это самый тупорылый вариант, с учетом того, что из управляещей проги нет доступа к WinAPI.
umbra (2005-09-23 16:00:00) [5]Серверная, в основном. Самба, сендмейл, ксинетд, ссаш к примеру
BiN (2005-09-23 15:53:00) [6]http://66.249.93.104/search?q=cache:B7JYEdq4hnMJ:delphimaster.ru/cgi-bin/forum.pl%3Fid%3D1121359278%26n%3D5+querydosdevice+%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0+Delphi&hl=ru
а также
http://66.249.93.104/search?q=cache:mYb99Yo7iqwJ:www.delphimaster.ru/cgi-bin/forum.pl%3Fid%3D1120126541%26n%3D5+querydosdevice+%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0+Delphi&hl=ru
(спасибо кэшу гугля)
Игорь Шевченко (2005-09-23 15:48:00) [7]
> Хотя на этом замечательном лисапедном способе держится пол-
> линуха.
Какая именно половина Linux'а ? :)
umbra (2005-09-23 15:23:00) [8]аварийное завершение тоже можно перехватить и файл закрыть (удалить)
Но я согласен, пример не очень удачный. Хотя на этом замечательном лисапедном способедержится пол-линуха.
Джо (2005-09-23 15:09:00) [9]
> [34] umbra © (23.09.05 14:57)
> Или например, при запуске проги надо убедиться, что это
> первый ее екземпляр. Для этого при запуске проверяется,
> открыт ли определенный файл -если открыт, то значит прога
> уже раз запущена, надо вторую закрывать. Опять таки, проще
> проверить файл, чем искать окна, процессы и т.д.
Очень показательный ответ.
Кстати, как думаешь - в какой место попадет твой замечательный лисапедный способ, если твою программу снимут из Task Manager'а? Или для этого предлагаешь решать задачу: "Как скрыть мой процесс из списка процессов"? Очень показательный ответ :(
umbra (2005-09-23 14:57:00) [10]
> что предполагается "делать"
Или например, при запуске проги надо убедиться, что это первый ее екземпляр. Для этого при запуске проверяется, открыт ли определенный файл -если открыт, то значит прога уже раз запущена, надо вторую закрывать. Опять таки, проще проверить файл, чем искать окна, процессы и т.д.
umbra (2005-09-23 14:50:00) [11]по-моему гораздо проще проверить открыт ли файл (спасибо, Tonich), чем устраивать механизм межпроцессного взаимодействиямежду программами разных разработчиков при отсутствии исходного кода.
simpson (2005-09-23 14:45:00) [12]> umbra © (23.09.05 14:43) [31]
Ну так причем же здесь сабж? Тебе всего лишь нужен механизм межпроцессного взаимодействия.
umbra (2005-09-23 14:43:00) [13]ну, к примеру, есть две проги, одна пишет в файл, другая из него читает. запускаются автоматически, интервалы между запусками изменяющиеся. А читать надо только после того, как все записано
simpson (2005-09-23 14:41:00) [14]> umbra © (23.09.05 14:34) [28]
Да нет таких прикладных задач, когда надо знать, открыт файл, или нет, прежде чем начинать с ним работу. Работа с файлами на прикладном уровне сводится к тому, чтобы попытаться открыть файл в нужномрежиме, и, если это невозможно, выдать соответствующеесообщение об ошибке и отреагировать согласно условиям задачи (например, прекратить работу, или попытаться позже).
Ну узнал ты, что файл, к которому ты пытаешься обратиться, занят процессом "proga.exe". И что? Жестоко убьешь этот процесс, чтобы самому начать работу с занятым файлом? Не думаю. :)
Джо (2005-09-23 14:37:00) [15]
> [28] umbra © (23.09.05 14:34)
> А если он доступен, но чтобы решить, что делать дальше надо
> знать, открыт он или нет?
Зависит, наверное, от того - что предполагается "делать". Это большая тайна?
umbra (2005-09-23 14:34:00) [16]пе
> обработать ситуацию, когда файл недоступен
А если он доступен, но чтобы решить, что делать дальше надо знать, открыт он или нет?
Игорь Шевченко (2005-09-23 13:57:00) [17]Джо © (23.09.05 13:38) [26]
> А смысл? Только для каких-то системных утилит
Да, конечно. В прикладной софтине вроде ни к чему
Джо (2005-09-23 13:38:00) [18]
> [25] Игорь Шевченко © (23.09.05 13:21)
> Возможно. Но непросто.
Да я тоже думаю, что докопаться все-таки можно (конкретный способ назвать "сходу" не могу). А смысл? Только для каких-то системных утилит или в познавательных целях. "Познавательный смысл" в виду того, что просится готовое решение - исключается; системные утилиты - исключаю "интуитивно" (возможно, ошибаюсь).
Игорь Шевченко (2005-09-23 13:21:00) [19]Джо © (23.09.05 12:57) [24]
> Думаю даже, что это и почти невозможно сделать, т.е., определить
> "открыт ли файл каким-нибудь процессом".
Возможно. Но непросто.
Джо (2005-09-23 12:57:00) [20]
> ТоХда прошу научить как же надо это делать, а то от ВАС
> было только замечание ....
Не могу научить, ибо сам не знаю. Думаю даже, что это и почти невозможно сделать, т.е., определить "открыт ли файл каким-нибудь процессом". Осмелюсь даже предположить - что, в принципе, это и не имеет практической пользы, выяснять такие нюансы. Достаточно корректно обработать ситуацию, когда файл недоступен. А не выяснять, почему он недоступен.