Занят ли файл кем-то.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Занят ли файл кем-то.

Сообщение Shurrik » 06.08.2009 (Чт) 6:34

Вопрос, который у меня возник состоит в следующем.
Есть сетевая программа, запущенная на разных машинах и мне необходимо установить, когда все из нее выйдут.
Есть файлы, которые эта программа открывает и держит,так что их нельзя заархивировать RAR-ом.
Подскажите пожалуйста, хотя бы в каком направлении рыть. У меня VS2003.
Интересно бы знать, какая машина держит файл, но это не обязательно.
Колесо: Хочешь жить? Умей вертеться.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Занят ли файл кем-то.

Сообщение MIT » 06.08.2009 (Чт) 9:12

Если по простому - пытаться открыть файл и ловить ошибку, а вот так будет по умному.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Занят ли файл кем-то.

Сообщение Shurrik » 07.08.2009 (Пт) 5:33

Огромное спасибо MIT за ссылку, но в статье описаны варианты, которые вряд ли мне подходят. Перечисление всех процессов?
Да у меня более 50 машин в сети и все работают с общими дисками и кучей разных программ.Я сильно сомневаюсь, что такое перечисление будет быстро работать. Первый вариант с открытием файла тоже к сожалению не катит, а перемещать (удалять вообще нельзя) мне очень не хочется. Можно ловить ошибку самого RAR-а при архивировании одного файла, но это как-то непроффесионально.
Может все-таки есть какой-то простой способ.
Колесо: Хочешь жить? Умей вертеться.

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Занят ли файл кем-то.

Сообщение Shurrik » 07.08.2009 (Пт) 6:30

Эврика!
Важно не просто открыть файл, а открыть без общего доступа!
Код: Выделить всё
    Private Function Dostup(ByVal fn As String) As Boolean
        Try
            If File.Exists(fn) Then
                Dim fs As FileStream = New FileStream(fn, FileMode.Open, FileAccess.Read, FileShare.None)
                fs.Close() : Return True
            End If
        Catch ex As Exception : Return False
        End Try
    End Function

Это должно работать. Сегодня же проверю на работе.
Колесо: Хочешь жить? Умей вертеться.

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: Занят ли файл кем-то.

Сообщение 773FF » 08.08.2009 (Сб) 20:59

А может быть Вам просто выполнить теневое копирование файла, а потом его архивировать (http://www.alphaleonis.com/2009/04/alphavss-and-alphafs-10-both-reached-beta/)?
Или нужно обязательно дожидаться освобождения файла?

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Занят ли файл кем-то.

Сообщение Shurrik » 09.08.2009 (Вс) 6:43

Скопировать а потом заархивировать я могу. Но такая копия мне не нужна, так как программа при работе блокирует записи баз с которыми работает. И после восстановления из копии программу просто выбивает без указания причины,а поиск блокированных записей в сотнях баз - это такая головная боль!
Тот вариант, который я выложил обладает еще одным полезным свойством. Если файл открыть и не закрывать, то ни одна машина не может запустить программу. Все происходит корректно, программа жалуется на ошибку и сама закрывается. А я могу лазить совершенно безопасно по самим базам и редектировать их. Это и есть основная проблема, нодо предупредить всех пользователей не входить в программу, когда я занимаюсь корректировкой баз. А потом опять дать им зеленый свет. Создание копии - это возможность отката. Очень часто кто-то забыл или отсутствовал, когда давался запрет и входит в программу. Вот тогда без матюков просто не обойтись, так как проходится начинать все с начала, а вся предыдущая работа идет на смарку.
Всем, кто ответил большое спасибо!
Колесо: Хочешь жить? Умей вертеться.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Занят ли файл кем-то.

Сообщение Денис » 10.08.2009 (Пн) 8:09

Shurrik писал(а):Это и есть основная проблема, нодо предупредить всех пользователей не входить в программу, когда я занимаюсь корректировкой баз.

Боже мой! А про монопольный режим доступа к БД Вы и не знали?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Re: Занят ли файл кем-то.

Сообщение Shurrik » 11.08.2009 (Вт) 6:38

Денис, твой вопрос скорее к разработчику этой долбаной программы, а не ко мне. Я вынужден пользоваться тем, что спустили сверху. А проблема возникает именно из-за моего монопольного доступа к одной из баз. Другой пользователь входит, натыкается на эту базу, программа или виснет или ее просто выбивает. В результате новые ошибки где-то еще, так как базы сильно завязаны друг на друга. Все ошибки с которыми приходится бороться - результат действий операторов, которые работают вполне корректно, это программы !!!!!! такая. О, боженька, замени этого DOS-урода на что-нибудь другое.
Колесо: Хочешь жить? Умей вертеться.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Занят ли файл кем-то.

Сообщение Денис » 11.08.2009 (Вт) 7:45

Shurrik
Слишком много восклицательных знаков >_<
Да, если бы у тебя был доступ к структуре БД (я имею ввиду даже не доступ, а санкцию на изменение этой структуры), то можно было бы просто поступить: создается таблица, в ней всего одна запись и одно поле типа Boolean. Это поле - флаг монопольного режима. Если программа работает не в режиме администратора, то по таймеру проверяет значение флага, если True, то выводим сообщение, типа "В программе проводится обновление. Надо выйти." и одна кнопка "ОК" и таймер автоматического нажатия на кнопку через секунд 10.
Конечно, если бы база была нормальная, промышленная, то этих танцев с бубном вообще бы не понадобилось.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 77

    TopList