@outrunningkarma

System.ObjectDisposedException: «Доступ к закрытому файлу невозможен.» не понятно, что не так?

Решил написать форму которая при вводе в textBox, определяет високосный год или нет и записывает данные в файлы. Если год високосный, то записывается в docx, если нормальный то в txt. Но выдает ошибку:
System.ObjectDisposedException
  HResult=0x80131622
  Сообщение = Доступ к закрытому файлу невозможен.
  Источник = mscorlib
  Трассировка стека:
   в System.IO.__Error.FileNotOpen()
   в System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
   в System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   в System.IO.StreamWriter.Dispose(Boolean disposing)
   в System.IO.StreamWriter.Close()
   в Wfiles_years.Form1.button1_Click(Object sender, EventArgs e) в C:\Users\Alikhan\source\repos\Wfiles_years\Form1.cs:строка 58
   в System.Windows.Forms.Control.OnClick(EventArgs e)
   в System.Windows.Forms.Button.OnClick(EventArgs e)
   в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ButtonBase.WndProc(Message& m)
   в System.Windows.Forms.Button.WndProc(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   в System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   в System.Windows.Forms.Application.Run(Form mainForm)
   в Wfiles_years.Program.Main() в C:\Users\Alikhan\source\repos\Wfiles_years\Program.cs:строка 19

А вот и сам код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Wfiles_years
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

      

        private void button1_Click(object sender, EventArgs e)
        {
            int year = Convert.ToInt32(textBox1.Text);

            FileStream fileV = new FileStream(@"C:\Users\Alikhan\Desktop\CSharp\yeardz\Year1.docx", FileMode.OpenOrCreate);
            FileStream fileO = new FileStream(@"C:\Users\Alikhan\Desktop\CSharp\yeardz\Year2.txt", FileMode.OpenOrCreate);
            StreamWriter writerV = new StreamWriter(fileV);
            StreamWriter writerO = new StreamWriter(fileO);

            if (year % 4 !=0)
            {
                writerO.WriteLine();
            }
            else if (year % 100 == 0)
            {
                if (year % 400 == 0)
                {
                    writerV.WriteLine();
                }
                else
                {
                    writerO.WriteLine();
                }
            }
            else
            {
                writerO.WriteLine();
            }





            fileV.Close();
            fileO.Close();
            writerV.Close();    // Ругается к этой функций.
            writerO.Close();


        }

        private void button2_Click(object sender, EventArgs e)
        {
            Directory.Delete(@"C:\Users\Alikhan\Desktop\CSharp\yeardz\Year1.docx");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Directory.Delete(@"C:\Users\Alikhan\Desktop\CSharp\yeardz\Year2.txt");
        }
    }
}
  • Вопрос задан
  • 1358 просмотров
Решения вопроса 1
@Asapin
В свободное время ковыряюсь с Rust и Wasm
Согласно документации, метод Close у StreamWriter самостоятельно закрывает нижележащий поток (в вашем случае это FileStream). И при закрытии нижележащего потока StreamWriter пытается записать в него всё, что, возможно, успело накопиться в буфере,но еще не было записано (строка
System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
в вашем стектрейсе).
Но так как файловый поток уже закрыт, вызов метода Flush приводит к ошибке.

Совет на будущее - закрывайте потоки в порядке обратном тому, в котором вы их открывали. Т.е. если вы их открывали в порядке A -> B(A) -> C(B), то закрывать их надо в порядке C, B, A.
По крайней мере в Java, закрытие уже закрытого потока является по сути no-op (если поток уже закрыт, то делается return из метода Close). И подозреваю, что в C# сделано так же. А значит и ошибок таких не будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
В сообщении написано же
Доступ к закрытому файлу невозможен.

Нужно открыть файл на запись.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы