Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как узнать открыт файл или нет?


Страницы:   1 2 3

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]


> ТоХда прошу научить как же надо это делать, а то от ВАС
> было только замечание ....

Не могу научить, ибо сам не знаю. Думаю даже, что это и почти невозможно сделать, т.е., определить "открыт ли файл каким-нибудь процессом". Осмелюсь даже предположить - что, в принципе, это и не имеет практической пользы, выяснять такие нюансы. Достаточно корректно обработать ситуацию, когда файл недоступен. А не выяснять, почему он недоступен.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо