System.ObjectDisposedException Error on C# v4.0

拟墨画扇 提交于 2019-12-24 00:36:04

问题


I implemented this code: C# Processing Fixed Width Files

But since my work PC runs Windows XP I had to save the program using C# v4.0. Unfortunately the following code:

static string filePath = "";

public Main()
{
    InitializeComponent();
}

private void buttonLoadFile_Click(object sender, EventArgs e)
{
    DialogResult openFile = openFileDialog.ShowDialog();
    if (openFile == DialogResult.OK)
    {
        filePath = openFileDialog.FileName;
    }
}

private void buttonProcessFile_Click(object sender, EventArgs e)
{
    if (filePath == "")
    {
        MessageBox.Show("Load Fixed Width File First", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

    }
    else
    {
        if (textboxFilePath.Text == "")
        {
            MessageBox.Show("Enter CSV File Path", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            DialogResult result = DialogResult.No;

            if (File.Exists(filePath))
            {
                result = MessageBox.Show("Overwrite CSV File?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            }

            if (result == DialogResult.Yes)
            {
                var lines = File.ReadLines(filePath);

                var widthList = lines.First().GroupBy(c => c)
                                             .Select(g => g.Count())
                                             .ToList();

                var list = new List<KeyValuePair<int, int>>();

                int startIndex = 0;

                for (int i = 0; i < widthList.Count(); i++)
                {
                    var pair = new KeyValuePair<int, int>(startIndex, widthList[i]);
                    list.Add(pair);

                    startIndex += widthList[i];
                }

                var csvLines = lines.Select(line => string.Join(",",
                                    list.Select(pair => line.Substring(pair.Key, pair.Value))));

                File.WriteAllLines(textboxFilePath.Text, csvLines);

                MessageBox.Show("File Saved", "Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
        }
    }
}

Gives me this error when run on Windows XP and compiled in C# v4.0:

************** Exception Text **************
System.ObjectDisposedException: Cannot read from a closed TextReader.
   at System.IO.__Error.ReaderClosed()
   at System.IO.StreamReader.ReadLine()
   at System.IO.File.<InternalReadLines>d__0.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.IO.File.InternalWriteAllLines(TextWriter writer, IEnumerable`1 contents)
   at System.IO.File.WriteAllLines(String path, IEnumerable`1 contents)
   at FixedWidthFiles.Main.buttonProcessFile_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
FixedWidthFiles
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/TEMP/FixedWidthFiles.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.1 built by: RTMRel
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------

Any suggestions?


回答1:


From MSDN Doc

The ReadLines and ReadAllLines methods differ as follows: When you use ReadLines, you can start enumerating the collection of strings before the whole collection is returned; when you use ReadAllLines, you must wait for the whole array of strings be returned before you can access the array. Therefore, when you are working with very large files, ReadLines can be more efficient.

Change your code,

var widthList = File.ReadLines(@"C:\input.txt").First().GroupBy(c => c)
                             .Select(g => g.Count())
                             .ToList();

Or use

var lines = File.ReadAllLines(@"C:\input.txt");

var widthList = lines.First().GroupBy(c => c)
                             .Select(g => g.Count())
                             .ToList();


来源:https://stackoverflow.com/questions/12562414/system-objectdisposedexception-error-on-c-sharp-v4-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!