Разрешение используемого файла исключений после закрытия StreamWriter - PullRequest
0 голосов
/ 03 мая 2011

Я получаю сообщение об ошибке:

The process cannot access the file 
'C:\AMR_VOYANT_TESTING\PWM_TESTER\UUT_LOGS\TEST_LOG_PWM_10245_UUT_SN_10.TXT'
because it is being used by another process.

Моя программа сбрасывает, закрывает и удаляет файл журнала.Позже моя программа пытается открыть файл, чтобы добавить больше данных.Это второе открытие вызывает вышеуказанное исключение.

Process Explorer не показывает дескриптор файла, во время выполнения либо прямого доступа к двоичному файлу, либо в режиме отладки с MS Visual C # Express 2008.

Других процессов нет должен использовать этот файл, так как это оригинальный файл, созданный моим приложением.

Некоторые решения в Stack Overflow предлагают реализовать оператор using, но это невозможно, поскольку запись данных не происходит в простом или коротком составном операторе.Записывающий делегат используется классом журналирования для записи данных в файл.

Согласно другим решениям в переполнении стека, в цикле for файл не может быть закрыт до следующей итерации, где файл открывается.Я ждал более 10 секунд, прежде чем снова открыть файл, но безрезультатно (то же исключение).

Вот пример кода:

    public void
    close()
    {
        get_log_file().WriteLine("");
        get_log_file().Flush();
        get_log_file().Close();
        get_log_file().Dispose();
        m_log_file = null;
        return;
    }


    private StreamWriter
    get_log_file()
    {
        if (m_log_file == null)
        {
            bool successful = false;
            int retries_remaining = 5;
//                do
//                {
//                    try
//                    {            
//                        m_log_file = new StreamWriter(m_filename, true);
                m_log_file = new StreamWriter(new FileStream(m_filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
//                    }
//                    catch (IOException)
//                    {

//                        --retries_remaining;
//                        System.Threading.Thread.Sleep(250); // Units are in milliseconds;
//                    }
//                } while (!successful && (retries_remaining >= 0));
            }
            return m_log_file;
        }
        private System.IO.StreamWriter m_log_file = null;
        private string m_filename;

Поскольку у меня есть крайний срок, я ищу решения для этой проблемы.Вот некоторые из моих идей:

  1. Держите файл открытым;не открывайте и не закрывайте во время тестовых прогонов.
  2. Отображение сообщения «Ожидание файла» для пользователя во время опроса файла (чтобы увидеть, когда его можно открыть снова)
  3. Запись неуправляемого Cили библиотека C ++ для обработки файлового ввода-вывода (поскольку неуправляемые C и C ++ не используют .NET Framework).
  4. Обучение тому, как сообщить .NET Framework, что нужно поторопиться и закрыть файл.

Я использую MS Visual C # 2008 Express в Windows 7, 64-битная архитектура.

Ответы [ 4 ]

0 голосов
/ 04 мая 2011

Я решил эту проблему, оставив файл открытым, что устраняло необходимость повторного открытия его каждый раз.

0 голосов
/ 03 мая 2011

Я надеюсь предложить вам быстрое решение - заменить FileMode.OpenorCreate на FileMode.Append;

Как отмечают другие, существует множество других вариантов ведения журнала, но я полагаю, что это может предложить вамбыстрый путь вперед от того места, где вы стоите, вместо того, чтобы идти вперёд, чтобы двигаться вперед.

Мне кажется, что ваш код является фрагментом класса, который возвращает потоковый обработчик в вызывающий контекст.Я бы заставил ваш класс реализовать IDisposable, изменив ваше значение close на Dispose (для реализации IDisposable), а затем заставил бы вашего потребителя превратить вызов в использование (yourLogClass logger = new yourLogClass ()) ... и т. Д., Чтобы гарантировать, что закрытие вызываетсяс каждым использованием.

0 голосов
/ 03 мая 2011

Код, который вызывает методы в этом классе, не вызывает ваш метод close () после вызова метода open. Основываясь на опубликованном вами коде, я предполагаю, что существует отдельный метод open. Если этот метод вызывается более одного раза, вы получите исключение, которое вы описываете. Код, который вы опубликовали, не имеет проблем, которые могут вызвать исключение, которое вы получаете. Если вы вызываете Flush () перед вызовом Close (), это приведет к принудительной записи на диск, чтобы при вызове Close () не было задержки, я забивал файлы, открывая и закрывая их сотни раз за секунду или две, и никогда была эта проблема.

Обновление: если ваш код выдал исключение во время отладки, VS по-прежнему имеет открытый дескриптор этого файла. Он продолжит генерировать это исключение, даже если вы исправили свой код. Я обычно просто закрываю и перезагружаю VS, чтобы не связываться с настройками моего проекта и случайно включить их в систему контроля версий.

0 голосов
/ 03 мая 2011
  1. Если вы хотите сделать все правильно, вам придется потратить некоторое время.Или
  2. Используйте трассировку или каркас framework.
  3. Я полагаю, вы отлаживаете с помощью процесса размещения Visual Studio.Попробуйте отключить его и проверьте, устранена ли проблема с блокировкой файлов.

Отключите флажок

Project - Properties - Debug - x Enable Visual Studio hosting process

Также возможно, что вы отслеживаете один из финализаторов во времязавершение работы приложения, когда StreaWriter уже был закрыт.Вы можете обойти это, используя Критический финализатор

Ваш, Алоис Краус

...