![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Доброго здоровья, уважаемые!
Наверняка многим попадалось такое исключение при записи из стрима в файл:
Так вот вопрос: как сделать проверку, что файл никем не занят для предупреждения этого исключения? Что-то подсказывает мне, что нужно юзать System.Security.AccessControl.FileSecurity, но пока для меня это темный лес, ткните меня носом пожалуйста, куда смотреть нужно. Или может, ссылка есть хорошая. Заранее благодарен! -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
| tdebugger |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.1.2007 Репутация: 2 Всего: 4 |
А что мешает осуществить проверку открыванием файла на чтение\запись с помощью классов IO ?
--------------------
ТЕХНОЛОГИЯ "JAVA" НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
tdebugger,
Каким образом, если не секрет? Получил ошибку на запись, значит файл занят? Так неинтересно... Хочу заранее знать, юзается файл каким-то процессом, или нет. Причем я не говорю, что обязательно FileSecurity нужно использовать, потому что еще сам не знаю, что в этом классе есть. Любой вариант подойдет, кроме обработки исключений ввода-вывода. -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
| Pit_Bul |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 2.10.2006 Репутация: нет Всего: 1 |
Так твое исключение и есть проверка на доступность файла, смотри как работает
|
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Pit_Bul, блин елы-палы, знаю я, как исключения работают! Но если мне нужно именно одно-единственное исключение (когда файл занят) оттуда выдрать и обработать его, мне что, для этого текст ошибки парсить что ли? В классе IOException различных исключений выше крыши. Вот есть же метод File.Exists(), к примеру. Наверняка и для моей темы что-нибудь существует... Целое пространство имен AccessControl для чего-нибудь, да создали же...
-------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
| Wanderer2019 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 937 Регистрация: 3.12.2004 Где: Санкт-Петербург/П рага Репутация: 7 Всего: 17 |
Насколько я понимаю для тебя существует именно Exception. Ничего парсить не надо. У каждой ошибки существует свой номер, по нему и ориентируйся.
AccessControl существует для того, чтобы работать со списком безопасности. |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Wanderer2019,
И где его взять тогда, этот номер? -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
| Experimenter |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Все, сам нашел:
НО:
Тогда еще придется исключать номера всех наследуемых эксепшенов. Какие еще будут предложения? -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
||||||
|
|||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Проверить существование файла (File.Exists), потом открыть файл в режиме FileShare.ReadWrite и если кинет любое исключение - значит файл эксклюзивно открыт на запись в другом процессе.
-------------------- ![]() |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Experimenter, у тебя вылетает system.UnauthorizedAccessException
его и отлавливай -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
mr.DUDA, вот это уже более конструктивно, я тоже об этом думал, сначала отмёл, так как без исключений хотел сделать. Но видимо, без них никак не обойдешь этот камень.
Добавлено через 5 минут и 5 секунд tol05, неавторизованный доступ тут ни при чем, такое исключение возникает, когда к примеру поток хочет в нерасшаренный файл данные записать, а в это время другой поток что-то пишет уже. Когда тот, что занимал файл, отвалился, тот, что хотел записывать, получает доступ. -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Странно, данное исключение получаем даже в следующем коде:
Есть же разрешение на совместный доступ???!!! Это сообщение отредактировал(а) Experimenter - 12.9.2007, 06:41 -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Так работает:
Почему - надо почитать матчасть о правах доступа к файлам (не в .NET -- там мало инфы, а в Platform SDK). -------------------- ![]() |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
и даже так работает
матчасть ни при чем. Достаточно логически поразмышлять... При создании первого потока Experimenter заявлял, что готов на совместный доступ к файлу. А кому это интересно? Никто этот файл не шарит еще. А вот при создании второго потока - нужно сказать, что готовы на совместный доступ. Потому как на момент создания второго потока может оказаться, что файл уже кто-то юзает. (А так оно и есть). P.S. если и второй поток нужен на чтение-запись, тогда да, нужно оба потока шарить... (вариант mr.DUDA) Это сообщение отредактировал(а) tol05 - 12.9.2007, 09:56 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
В общем-то шаред ресурсы как раз и не нужны, это случайно выявилось.
Пошарив по System.IO небезызвестной и очень популярной программой, получаем, что все явные и неявные создания стримов проходят через некий файлстримовский внутренний метод void Init. Там проверяется всё и вся. Кому интересно, аттач сделал. Но где-то на половине содержимого мои скудные познания заканчиваются, ни асилил, признаюсь честно. Да и действительно, проще исключения отловить, чем в такие дебри залезать. Может когда-нибудь я и освою все это, но пока времени нет на неспешный, вдумчивый анализ. И все-таки, возвращаясь к сабжу, система-то не дура и знает, что этот несчастный файл занят другим процессом, иначе бы не выдавала таких сообщений. Значит должен быть способ и другим это узнать. Век живи, век учись!!! (интересно, кто же такой, этот век, и что его так все воспитывать пытаются). Присоединённый файл ( Кол-во скачиваний: 6 )
init.cs 7,92 Kb-------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |