Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка доступа к файлу 
:(
    Опции темы
Experimenter
Дата 10.9.2007, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



Доброго здоровья, уважаемые!

Наверняка многим попадалось такое исключение при записи из стрима в файл:
Цитата

The process cannot access the file 'c:\myfile.txt' because it is being used by another process.

Так вот вопрос: как сделать проверку, что файл никем не занят для предупреждения этого исключения? Что-то подсказывает мне, что нужно юзать 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"); }
PM WWW ICQ   Вверх
tdebugger
Дата 10.9.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.1.2007

Репутация: 2
Всего: 4



А что мешает осуществить проверку открыванием файла на чтение\запись с помощью классов IO ?
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
Experimenter
Дата 10.9.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



tdebugger, 
Цитата

А что мешает осуществить проверку открыванием файла на чтение\запись с помощью классов IO ? 

Каким образом, если не секрет? Получил ошибку на запись, значит файл занят? Так неинтересно... Хочу заранее знать, юзается файл каким-то процессом, или нет. Причем я не говорю, что обязательно 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"); }
PM WWW ICQ   Вверх
Pit_Bul
Дата 10.9.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 2.10.2006

Репутация: нет
Всего: 1



Так твое исключение и есть проверка на доступность файла, смотри как работает

Код

try
{
//здесь открываешь файл
}
catch(Exeption e)
{
//при недоступности файла здесь вылетант исключение
//e.Message.ToSring() - это текст исключения
}
finaly
{
//здесь код который должен выполниться в любом случае
}


PM MAIL WWW   Вверх
Experimenter
Дата 10.9.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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"); }
PM WWW ICQ   Вверх
Wanderer2019
Дата 10.9.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

Репутация: 7
Всего: 17



Насколько я понимаю для тебя существует именно Exception. Ничего парсить не надо. У каждой ошибки существует свой номер, по нему и ориентируйся. 
AccessControl существует для того, чтобы работать со списком безопасности.

PM ICQ MSN   Вверх
Experimenter
Дата 11.9.2007, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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"); }
PM WWW ICQ   Вверх
Experimenter
Дата 11.9.2007, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



Цитата

И где его взять тогда, этот номер?

Все, сам нашел:
Цитата

IOException uses the HRESULT COR_E_IO which has the value 0x80131620.

НО:
Цитата

IOException is the base class for exceptions thrown while accessing information using streams, files and directories.

The Base Class Library includes the following types, each of which is a derived class of IOException : 
DirectoryNotFoundException 
EndOfStreamException 
FileNotFoundException 
FileLoadException 
PathTooLongException 

Where appropriate, use these types instead of IOException.

Тогда еще придется исключать номера всех наследуемых эксепшенов.

Какие еще будут предложения?


--------------------
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"); }
PM WWW ICQ   Вверх
mr.DUDA
Дата 11.9.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Проверить существование файла (File.Exists), потом открыть файл в режиме FileShare.ReadWrite и если кинет любое исключение - значит файл эксклюзивно открыт на запись в другом процессе.


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 11.9.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Experimenter, у тебя вылетает  system.UnauthorizedAccessException 
его и отлавливай



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Experimenter
Дата 11.9.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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"); }
PM WWW ICQ   Вверх
Experimenter
Дата 12.9.2007, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



Странно, данное исключение получаем даже в следующем коде:
Код

    FileStream fs1 = new FileStream("abcd.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
    FileStream fs2 = new FileStream("abcd.txt", FileMode.Open, FileAccess.Read);

Есть же разрешение на совместный доступ???!!!

Это сообщение отредактировал(а) 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"); }
PM WWW ICQ   Вверх
mr.DUDA
Дата 12.9.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Так работает:
Код
FileStream fs1 = new FileStream(@"abcd.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream fs2 = new FileStream(@"abcd.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);


Почему - надо почитать матчасть о правах доступа к файлам (не в .NET -- там мало инфы, а в Platform SDK).


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 12.9.2007, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



и даже так работает
Код

FileStream fs1 = new FileStream("abcd.txt", FileMode.Open, FileAccess.ReadWrite);
FileStream fs2 = new FileStream("abcd.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

матчасть ни при чем. Достаточно логически поразмышлять... smile

При создании первого потока Experimenter заявлял, что готов на совместный доступ к файлу. А кому это интересно? Никто этот файл не шарит еще.
А вот при создании второго потока - нужно сказать, что готовы на совместный доступ. Потому как на момент создания второго потока может оказаться, что файл уже кто-то юзает. (А так оно и есть).

P.S. если и второй поток нужен на чтение-запись, тогда да, нужно оба потока шарить... (вариант mr.DUDA)

Это сообщение отредактировал(а) tol05 - 12.9.2007, 09:56


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Experimenter
Дата 12.9.2007, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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"); }
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.