【问题标题】:In C# while creating a file second time will throw an exception在 C# 中第二次创建文件时会抛出异常
【发布时间】:2012-11-16 04:43:40
【问题描述】:

我正在使用文件流创建文件,但在此之前我正在应用 if 条件来查看文件是否存在。当我单击按钮并且假设文件在那里时,它会删除该文件。没关系,如果我再次按下按钮,文件就会被创建。第一次效果很好。

现在文件已创建,如果我再次按下按钮,它应该删除,但它会抛出一个异常说*进程无法访问文件“C:\Hello1”,因为它正在被另一个使用过程。*

下面是我的代码

     private void button2_Click(object sender, EventArgs e)
    {
        string fileName = @"C:\Hello1";
        if

            (File.Exists(fileName))
        {
            File.Delete(fileName);
            MessageBox.Show("File is deleted");
        }
        else
        {
            FileInfo createFile = new FileInfo(fileName);
            FileStream create = createFile.Create();
            MessageBox.Show("Created");

        }
    }

所以为什么我不能第二次删除,我的文本文件也没有打开,但仍然显示异常。

【问题讨论】:

  • 可能是您在创建文件时没有关闭/处置您的Filestream,因此当您尝试删除它时,您的程序第二次仍然有效地打开文件?

标签: c# winforms


【解决方案1】:

您永远不会关闭创建文件的流。将您的FileStream 放入using 语句中,这将自动清理打开的文件句柄。

using(FileStream create = createFile.Create())
{
    //code here
}

【讨论】:

    【解决方案2】:

    第二次尝试时文件流仍然打开,试试这个:

    private void button2_Click(object sender, EventArgs e)
    {
        string fileName = @"C:\Hello1";
        if
    
            (File.Exists(fileName))
        {
            File.Delete(fileName);
            MessageBox.Show("File is deleted");
        }
        else
        {
            FileInfo createFile = new FileInfo(fileName);
            using(FileStream create = createFile.Create())
            {
                MessageBox.Show("Created");
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      哦,是的,我得到了答案,

      我需要使用

           private void button2_Click(object sender, EventArgs e)
      {
          string fileName = @"C:\Hello1";
          if
      
              (File.Exists(fileName))
          {
              File.Delete(fileName);
              MessageBox.Show("File is deleted");
          }
          else
          {
              FileInfo createFile = new FileInfo(fileName);
              FileStream create = createFile.Create();
              MessageBox.Show("Created");
              create.Close();
      
          }
      }
      

      我们需要使用 create.Close();

      【讨论】:

      • 或者使用using,它会在离开使用范围时自动调用Dispose()
      【解决方案4】:

      这是我用来写本地日志的例子:

                  StreamWriter log;
      
                  string fpath = string.Format(@"{0}\{1}.txt",GetDirectory(),DateTime.Now.ToString("yyy-MM-dd"));
                  if (!File.Exists(fpath))
                  {
                      log = new StreamWriter(fpath);
                  }
                  else
                  {
                      log = File.AppendText(fpath);
                  }
      
                  log.WriteLine(string.Format("{0} ==> {1}",DateTime.Now.ToString("MM/dd/yyy HH:mm:ss"), Message));
      
                  log.Dispose();
                  log = null;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 2014-02-06
        • 1970-01-01
        • 2013-11-14
        相关资源
        最近更新 更多