【问题标题】:Closing a file after File.Create [duplicate]在 File.Create 之后关闭文件 [重复]
【发布时间】:2011-03-01 15:06:05
【问题描述】:

我用

检查文件是否存在
if(!File.Exists(myPath))
{
    File.Create(myPath);
}

但是,当我用这个新创建的文件创建 StreamReader 时,我收到一条错误消息

该进程无法访问文件“[my file path here]”,因为它正被另一个进程使用。

没有我可以调用的File.Close(myPath) 以便在创建后关闭它,那么如何释放此资源以便稍后在我的程序中打开它?

【问题讨论】:

  • 像这样使用它File.Create(myPath).Close();

标签: c# file-io


【解决方案1】:

File.Create(string) 返回FileStream class 的一个实例。你可以在这个对象上调用Stream.Close() 方法来关闭它并释放它正在使用的资源:

var myFile = File.Create(myPath);
myFile.Close();

但是,由于FileStream 实现了IDisposable,您可以利用using statement(通常是处理此类情况的首选方式)。这将确保流在您完成后关闭并正确处理:

using (var myFile = File.Create(myPath))
{
   // interact with myFile here, it will be disposed automatically
}

【讨论】:

    【解决方案2】:

    该函数返回一个FileStream 对象。因此,您可以使用它的返回值来打开您的 StreamWriter 或使用对象的正确方法关闭它:

    File.Create(myPath).Close();
    

    【讨论】:

    • 会发生什么,如果你的路径错误并出错,永远不要关闭文件。然后你有麻烦了,还是我错了?。
    • @JuanRuizdeCastilla 如果他的路径错误,则不会创建文件,也不会打开流。
    【解决方案3】:

    File.Create 返回一个FileStream 对象,您可以在该对象上调用Close()

    【讨论】:

      【解决方案4】:
      File.WriteAllText(file,content)
      

      创建 写 关闭

      File.WriteAllBytes--   type binary
      

      :)

      【讨论】:

      • 优秀的时尚解决方案我的朋友。将我的 5 行代码逐一删掉……谢谢
      【解决方案5】:

      原因是因为您的方法返回了 FileStream 来创建文件。您应该将 FileStream 返回到一个变量中,或者在 File.Create 之后直接从它调用 close 方法。

      让 using 块帮助您为此类任务实现 IDispose 模式是最佳实践。也许更好的做法是:

      if(!File.Exists(myPath)){
         using(FileStream fs = File.Create(myPath))
         using(StreamWriter writer = new StreamWriter(fs)){
            // do your work here
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多