IOException "The handle is invalid"
От: TATAPuH США  
Дата: 31.05.05 06:45
Оценка:
Люди добрые поможите чем знаете.

if( File.Exists(_path) )
{
 FileStream fStream =  new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 16384);
 long l = fStream.Length; //или любая другая операция с файлом
}



получаю ексепшин IOException "The handle is invalid"

стабильно возникает когда мы потеряли конект с сервером (шареной папкой)
. например шнурок из машины вытащили
. или сервер ребутнулся
. или эмулируем отключение конекта через "Computer Management->Shared Folders->Open Files" ручками отрываем коннект
и пытаемся переоткрыть файл


в общем отловить потерю коннекта не проблема
но вот востановить уже не получается — как быть ?

при перезапуске программы всё понятно окей — но вот перезапускать то не хочется
Re: IOException "The handle is invalid"
От: Chupa_Kabra  
Дата: 31.05.05 07:21
Оценка:
Действительно
    try
    {
        using (FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.None))
        {
            // Перед чтением убиваем насильно коннект
            fs.ReadByte();
        }
    }
    catch (Exception ex)
    {
        //Падаем с исключением, что не верный дескриптор
        Console.WriteLine(ex);
    }
    // Не открывается, говорит The process cannot access the file такой-то because it is being used by another process
    using (FileStream fs =new FileStream(FileName, FileMode.Open))
    {
        fs.ReadByte();
    }
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re: IOException "The handle is invalid"
От: _FRED_ Россия
Дата: 31.05.05 07:37
Оценка:
Здравствуйте, TATAPuH, Вы писали:

TAT>Люди добрые поможите чем знаете.

TAT>if( File.Exists(_path) )
TAT>{
TAT> FileStream fStream =  new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 16384);
TAT> long l = fStream.Length; //или любая другая операция с файлом
TAT>}

TAT>получаю ексепшин IOException "The handle is invalid"
TAT>стабильно возникает когда мы потеряли конект с сервером (шареной папкой)

А чего ты хотел? Что бы поток читал данные из ниоткуда??

TAT> . например шнурок из машины вытащили

TAT> . или сервер ребутнулся
TAT> . или эмулируем отключение конекта через "Computer Management->Shared Folders->Open Files" ручками отрываем коннект
TAT>и пытаемся переоткрыть файл
TAT>в общем отловить потерю коннекта не проблема
TAT>но вот востановить уже не получается — как быть?

Открыть поток заново после восстановления соединения не получается??? Из старого после ошибки читать надо? Не выйдет. Только переоткрытием потока, а не перезапуска программы.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[2]: IOException "The handle is invalid"
От: Andrbig  
Дата: 31.05.05 07:55
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:

C_K>Действительно

C_K>
C_K>    try
C_K>    {
C_K>        using (FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.None))
C_K>        {
C_K>            // Перед чтением убиваем насильно коннект
C_K>            fs.ReadByte();
C_K>        }
C_K>    }
C_K>    catch (Exception ex)
C_K>    {
C_K>        //Падаем с исключением, что не верный дескриптор
C_K>        Console.WriteLine(ex);
C_K>    }
C_K>    // Не открывается, говорит The process cannot access the file такой-то because it is being used by another process
C_K>    using (FileStream fs =new FileStream(FileName, FileMode.Open))
C_K>    {
C_K>        fs.ReadByte();
C_K>    }
C_K>


Ничего действительного. Второй раз совершенно нормально открывает и читает.
Re[3]: IOException "The handle is invalid"
От: Chupa_Kabra  
Дата: 31.05.05 08:03
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Ничего действительного. Второй раз совершенно нормально открывает и читает.


Какая у вас ОСь, паки и т.д. ? Надеюсь вы файл открывали по сети
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[2]: IOException "The handle is invalid"
От: Chupa_Kabra  
Дата: 31.05.05 08:05
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, TATAPuH, Вы писали:


TAT>>Люди добрые поможите чем знаете.

_FR>
TAT>>if( File.Exists(_path) )
TAT>>{
TAT>> FileStream fStream =  new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 16384);
TAT>> long l = fStream.Length; //или любая другая операция с файлом
TAT>>}
_FR>

TAT>>получаю ексепшин IOException "The handle is invalid"
TAT>>стабильно возникает когда мы потеряли конект с сервером (шареной папкой)

_FR> А чего ты хотел? Что бы поток читал данные из ниоткуда??


Почему из ниоткуда, читайте внимательнее, если машина осталась в ауте, то, понятно, в отвал, а если уже все в норме ? Это не повод перегружать приложение.

_FR>Открыть поток заново после восстановления соединения не получается??? Из старого после ошибки читать надо? Не выйдет. Только переоткрытием потока, а не перезапуска программы.


Что вы подразумеваете под переоткрытием потока. См. мой вариант. Там оно есть ?
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[4]: IOException "The handle is invalid"
От: _FRED_ Россия
Дата: 31.05.05 08:56
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
A>>Ничего действительного. Второй раз совершенно нормально открывает и читает.
C_K>Какая у вас ОСь, паки и т.д. ? Надеюсь вы файл открывали по сети

WinXP sp2. Всё ОК. Хинт: после включения сети на место подождать, пока компутер поймёт, что сетка на месте (у меня в трее вылезает соответствующий тултип).
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[5]: IOException "The handle is invalid"
От: Chupa_Kabra  
Дата: 31.05.05 09:13
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Chupa_Kabra, Вы писали:

A>>>Ничего действительного. Второй раз совершенно нормально открывает и читает.
C_K>>Какая у вас ОСь, паки и т.д. ? Надеюсь вы файл открывали по сети

_FR>WinXP sp2. Всё ОК. Хинт: после включения сети на место подождать, пока компутер поймёт, что сетка на месте (у меня в трее вылезает соответствующий тултип).

Блин, да не нужно сетку отрубать, зайдите в Computer Management и закройте вами же открытый файл.
Опытным путем установлено, что если открыть фалй в асинхронном режиме и подолбиться в него, в итоге он открывается. Максимальное время 10 секунд. Долго.
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[6]: IOException "The handle is invalid"
От: _FRED_ Россия
Дата: 31.05.05 09:23
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
C_K>Блин, да не нужно сетку отрубать, зайдите в Computer Management и закройте вами же открытый файл.
Спасибо, буду иметь в виду

C_K>Опытным путем установлено, что если открыть фалй в асинхронном режиме и подолбиться в него, в итоге он открывается. Максимальное время 10 секунд. Долго.


Ну дык всяко лучше перезапуска
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 461>>
Help will always be given at Hogwarts to those who ask for it.
Re[4]: IOException "The handle is invalid"
От: Andrbig  
Дата: 31.05.05 09:25
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:

C_K>Здравствуйте, Andrbig, Вы писали:


A>>Ничего действительного. Второй раз совершенно нормально открывает и читает.


C_K>Какая у вас ОСь, паки и т.д. ? Надеюсь вы файл открывали по сети


Win 2003 Server Standard Edition без SP. Файл открывал по UNC, обрубал сессию и закрывал открытый файл в Computer Management.
Re[7]: IOException "The handle is invalid"
От: Chupa_Kabra  
Дата: 31.05.05 09:37
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ну дык всяко лучше перезапуска

Конечно, но хочется большего
Опытным путем выяснилось, что если в программе одновременно открыть 2 раза один и тот же файл, реально в списке открытых файлов держится один коннект, то есть эти FileStream на каком-то уровне рашаривают общий хендл, и именно по этому открытие файла при ображении к содержимому кидает, что хендл не валидный. Для решения этой роблемы хочется найти это место и постараться явно закрыть его или точнее удалить информацию о якобы открытом файле.
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[5]: IOException "The handle is invalid"
От: Chupa_Kabra  
Дата: 31.05.05 09:39
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Chupa_Kabra, Вы писали:


C_K>>Здравствуйте, Andrbig, Вы писали:


A>>>Ничего действительного. Второй раз совершенно нормально открывает и читает.


C_K>>Какая у вас ОСь, паки и т.д. ? Надеюсь вы файл открывали по сети


A>Win 2003 Server Standard Edition без SP. Файл открывал по UNC, обрубал сессию и закрывал открытый файл в Computer Management.


А после открытия файла чтение из него делали ?
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[5]: IOException &quot;The handle is invalid&quot;
От: Аноним  
Дата: 31.05.05 10:33
Оценка:
Это же "чудеса ГЦ".

Нужно "пристреливать" хендл файла, перед повторным использованием переменной. После "using" хэндл на файл не удаляется, какие бы сказки МС не рассказывало про свой расчудесный ГЦ. Файл — unmanaged-ресурс, и общаться с ним нужно соответствующим образом.

А вот задержка, после которой файл опять становится доступен, и похожа на чистку, производимую ГЦ — хэндл удаляется. Похоже на чудеса с DbConnection-ом.

Real programmers don't comment their code. If it was hard to write, it should be hard to understand.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[6]: IOException &quot;The handle is invalid&quot;
От: Chupa_Kabra  
Дата: 31.05.05 10:39
Оценка:
Здравствуйте, BlackTigerAP, Вы писали:

BTA>Это же "чудеса ГЦ".


BTA>Нужно "пристреливать" хендл файла, перед повторным использованием переменной. После "using" хэндл на файл не удаляется, какие бы сказки МС не рассказывало про свой расчудесный ГЦ. Файл — unmanaged-ресурс, и общаться с ним нужно соответствующим образом.


BTA>А вот задержка, после которой файл опять становится доступен, и похожа на чистку, производимую ГЦ — хэндл удаляется. Похоже на чудеса с DbConnection-ом.


Похоже. Только юзинг, судя по всему, не приводит к гарантированному закрытию ресурса. Иначе второй поток, читающий из этого файла не сможет работать. Может это бред ? Зачем держать хендл на два потока ? но иначе не понятно, почему в CM я вижу только одно подключение к файлу ... В общем нужно искать ...
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[7]: IOException &quot;The handle is invalid&quot;
От: Chupa_Kabra  
Дата: 31.05.05 10:53
Оценка:
FileStream использует nested class, от абстрактного внутреннего класса System.Threaded.__HandleProtector. Он действительно считает количество использований хендла и имеет AddRef и Release.

Соотсветственно,

internal void Release()
{
      if (Interlocked.Decrement(ref this._inUse) == 0)
      {
            int num1 = this._handle;
            if ((num1 != -1) && (num1 == Interlocked.CompareExchange(ref this._handle, -1, num1)))
            {
                  this.FreeHandle(new IntPtr(num1));
            }
      }
}

абстрактный метод FreeHandle, как и следует ожидать, вызывается, когда количество использваний подошло к нулю.
По хорошему, нужно закрыть этот хендл и открыть новый, заполнив все это барахло данными, тогда не поломается логика работы всех FileStream`ов.
Все хотят хорошо провести время, но время не проведешь ! http://owl.pp.ru/ipb/html/emoticons/lac.gif
Re[6]: IOException "The handle is invalid"
От: Andrbig  
Дата: 31.05.05 11:51
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:

A>>Win 2003 Server Standard Edition без SP. Файл открывал по UNC, обрубал сессию и закрывал открытый файл в Computer Management.


C_K>А после открытия файла чтение из него делали ?


Ok, вот код:

public static void ok(string FileName)
{
    try
    {
        using (FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.None))
        {
            // Вот тут в Compter Management убиваю сессию, открытые файлы и все, что шевелится :)
            int n = (int)fs.Length;     // срубается прямо здесь
            byte[] buf = new byte[n];
            fs.Read (buf, 0, n);
        }
    }
    catch (Exception ex)
    {
        //Падаем с исключением, что не верный дескриптор
        Console.WriteLine(ex);
    }
    // Успешно открывается 
    using (FileStream fs =new FileStream(FileName, FileMode.Open))
    {
        int n = (int)fs.Length;  // Тут без ошибок
        byte[] buf = new byte[n];
        fs.Read (buf, 0, n);     // Тут также без ошибок
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.