none
Возникает исключение IO Exception с следующим сообщением: "Процесс не может получить доступ к файлу, т.к. этот файл используется другим процессом" RRS feed

  • Вопрос

  • У меня в приложении выполняется поток, в котором происходит, в частности, запись в файл OrderlogRevision.txt и чтение из этого файла:

    // Эта переменная - поле класса главного окна.
    private String fileToSaveOrderslogRevision = "OrderlogRevision.txt";
    
    // Этот код выполняется в потоке, запускаемом по кнопке.
    Int64 ordersLogRevision = 0;
    if (File.Exists(fileToSaveOrderslogRevision))
    {
         using (StreamReader srSaveOrderslogRevision = new StreamReader(fileToSaveOrderslogRevision))
        {
             while (srSaveOrderslogRevision.Peek() >= 0)
                  ordersLogRevision = Convert.ToInt64(srSaveOrderslogRevision.ReadLine());
        }
    }

    Когда я завершаю работу этого потока (т.е. успешно оканчивается), а потом если я снова запускаю его, то при достижении строки using (StreamReader srSaveOrderslogRevision = new StreamReader(fileToSaveOrderslogRevision)) происходит исключение IO Exception с следующим сообщением: "Процесс не может получить доступ к файлу, т.к. этот файл используется другим процессом". Что мне делать в этой ситуации? Каким-либо образом явно закрывать файл перед окончанием (при окончании) работы потока, что бы при следующем запуске потока всё выполнилось благополучно?

    19 октября 2012 г. 13:17

Ответы

  • Метода Close() мало. Объявляйте его в блоке using, как и в потоке чтения. Или вызывайте метод Dispose() явно.
    • Помечено в качестве ответа TownSparrow 19 октября 2012 г. 16:35
    19 октября 2012 г. 14:25
    Модератор
  • В using'е вызывается Dispose, и нужды в Close после этого нет.

    Вообще, файлы в Винде дело такое, что он может быть занят ещё какое-то (неопределённое) время, хотя по идее должен быть давно свободен. Недаром в реально работающем коде встречаются неоднократные попытки получения доступа к файлам по таймеру (или просто несколько раз подряд).

    Полагаю, нужно использовать FileStream, и открыть файл с указанием параметра FileShare.Read (или FileShare.ReadWrite), а этот файловый поток передать в StreamReader.

    • Помечено в качестве ответа Abolmasov Dmitry 22 октября 2012 г. 14:48
    19 октября 2012 г. 15:26

Все ответы

  • А где Вы записываете в этот файл? Скорее всего Вы где-нибудь открываете его на запись, и не закрываете поток, не освобождаете ресурсы.
    19 октября 2012 г. 14:09
    Модератор
  • Сейчас я его уже закрываю методом StreamWriter.Close() и это исключение исчезло, но появилось другое при попытке выполнить запись в закрытый StreamWriter, после того как я опять запускаю тред. Как сделать проверку - следует или нет открывать StreamWriter и каким методом его открывать, в данной ситуации, если требуется?

    19 октября 2012 г. 14:22
  • Метода Close() мало. Объявляйте его в блоке using, как и в потоке чтения. Или вызывайте метод Dispose() явно.
    • Помечено в качестве ответа TownSparrow 19 октября 2012 г. 16:35
    19 октября 2012 г. 14:25
    Модератор
  • OK, попробую.
    19 октября 2012 г. 14:27
  • В using'е вызывается Dispose, и нужды в Close после этого нет.

    Вообще, файлы в Винде дело такое, что он может быть занят ещё какое-то (неопределённое) время, хотя по идее должен быть давно свободен. Недаром в реально работающем коде встречаются неоднократные попытки получения доступа к файлам по таймеру (или просто несколько раз подряд).

    Полагаю, нужно использовать FileStream, и открыть файл с указанием параметра FileShare.Read (или FileShare.ReadWrite), а этот файловый поток передать в StreamReader.

    • Помечено в качестве ответа Abolmasov Dmitry 22 октября 2012 г. 14:48
    19 октября 2012 г. 15:26
  • Спасибо большое, ребята, за помощь. Я пока в using сделал - работает. Еще раз спасибо.

    19 октября 2012 г. 16:35
  • Не за что. Обращайтесь.
    19 октября 2012 г. 16:53
    Модератор