【问题标题】:File Input/output issue文件输入/输出问题
【发布时间】:2013-07-19 07:59:22
【问题描述】:
int AccNum;
FileStream myfile = new FileStream("C:\\bankin.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamReader rd = new StreamReader(myfile);
StreamWriter wt = new StreamWriter(myfile);
int a = Convert.ToInt32(rd.ReadLine());
AccNum = a;
a += 1;
wt.WriteLine(Convert.ToString(a));
Console.WriteLine(rd.ReadLine());
rd.Close(); 
wt.Close();
myfile.Close();

我正在尝试增加文件 bank.txt 中的整数值,但出现以下错误:

无法访问已关闭的文件

【问题讨论】:

  • 在哪一行抛出错误?

标签: c# file file-io


【解决方案1】:

也许是因为您在wt 之前关闭了rd?

如果是这种情况,我建议使用using 语句来防止将来出现这种混淆:

int AccNum;
using (FileStream myfile = new FileStream("C:\\bankin.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite)) {
    using (StreamReader rd = new StreamReader(myfile)) {
        using (StreamWriter wt = new StreamWriter(myfile)) {
            int a = Convert.ToInt32(rd.ReadLine());
            AccNum = a;
            a += 1;
            wt.WriteLine(Convert.ToString(a));
            Console.WriteLine(rd.ReadLine());
        }
    }
}

【讨论】:

    【解决方案2】:

    更改您的代码以使用 using 语句

    提供方便的语法,确保正确使用 IDisposable 对象。

    int AccNum;
    using(FileStream myfile = new FileStream("C:\\bankin.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
    using(StreamReader rd = new StreamReader(myfile))
    using (StreamWriter wt = new StreamWriter(myfile))
    {
        int a = Convert.ToInt32(rd.ReadLine());
        AccNum = a;
        a += 1;
        wt.WriteLine(Convert.ToString(a));
        Console.WriteLine(rd.ReadLine());
    }
    

    【讨论】:

      【解决方案3】:
      int AccNum;
      using(FileStream myfile = new FileStream("C:\\bankin.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
      {
          using(StreamReader rd = new StreamReader(myfile))
          {
              using(StreamWriter wt = new StreamWriter(myfile))
              {
                  int a = Convert.ToInt32(rd.ReadLine());
                  AccNum = a;
                  a += 1;
                  wt.WriteLine(Convert.ToString(a));
              }
              Console.WriteLine(rd.ReadLine());
          }
      }
      

      使用“使用”是个好习惯。

      【讨论】:

        【解决方案4】:

        异常是由 wt.Close() 行产生的,因为文件已经关闭。 StreamReader 上的 Close 方法关闭流和所有底层资源(参见http://msdn.microsoft.com/en-us/library/system.io.streamreader.close.aspx)

        我假设您要保存更改,因此请使用 Flush 保存或使用带有 AutoFlush 的 Close 代替 Flush。这是您的示例,经过一些修改

        int AccNum;
              using (FileStream myfile = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
              {
                using (StreamReader rd = new StreamReader(myfile))
                {
                  using (StreamWriter wt = new StreamWriter(myfile))
                  {             
                    int a = Convert.ToInt32(rd.ReadLine());
                    AccNum = a;
                    a += 1;
                    wt.WriteLine(Convert.ToString(a));
                    Console.WriteLine(rd.ReadLine());
                    wt.Flush();                
                  }
                }
              }
        

        【讨论】:

          猜你喜欢
          • 2013-12-15
          • 1970-01-01
          • 2011-09-20
          • 2012-06-15
          • 1970-01-01
          • 1970-01-01
          • 2019-08-07
          • 1970-01-01
          • 2011-09-22
          相关资源
          最近更新 更多