【问题标题】:File Create() and WriteAllText() in single class throw exception, [duplicate]单个类中的文件 Create() 和 WriteAllText() 抛出异常,[重复]
【发布时间】:2013-07-23 10:18:29
【问题描述】:

当我编写如下代码时,

protected void Page_Load(object sender, eventAgrs e)
{
  string xDoc ="Durgesh kumar rao";
  File.Create(Server.MapPath("~/XML"));
  File.WriteAllText(Server.MapPath("~/XML"), xDOC);
}

这个抛出异常,

进程无法访问该文件,因为它正被另一个进程使用。

是我做错了什么,还是文件静态方法执行了安全检查,即它抛出异常的原因。

【问题讨论】:

  • “我做错了什么吗” - 是的,您转储代码和异常消息,而不试图理解消息或显示您所做的事情。实际上有一百万个网页包含短语“该进程无法访问该文件,因为它正在被另一个进程使用”,其中this one 解释了您的问题和解决方案。
  • +1 因为这是一个有效的问题,如果有人没有意识到 Create() 会打开一个足够长的文件句柄以防止它被使用。
  • @ericosg 只是好奇,你为什么要投票(或回答)一个没有研究工作并且明显有多个重复的问题?我不认为“如果有人没有意识到”是一个原因,因为一旦你尝试理解它和/或为它做研究,你就可以开始意识到它。
  • 确实完全重复是没有意义的,但我是说即使经过研究也无法直观地实现。

标签: c# asp.net


【解决方案1】:

如果文件尚不存在,File.WriteAllText 将为您创建文件,因此您无需先调用 File.Create。您收到错误是因为 File.Create 创建并打开文件;调用 File.WriteAllText 时文件仍处于打开状态。

【讨论】:

    【解决方案2】:

    File.Create 创建文件并在其周围返回一个打开的FileStream,因此您已经拥有一个对文件句柄的引用,该文件句柄专门锁定它。在任何情况下,您都应该处理结果,在任何其他情况下,您都不应该丢弃调用的返回值。

    所以,简而言之,处置你的创作:

    using (FileStream stream = File.Create(path)) {
    
    }
    

    但是,File.WriteAllText 如果文件不存在,则创建该文件,因此您对Create 的调用除了有问题之外,是多余的。而这返回一个“徘徊”的流,它只是做的事情就是这样,所以只需使用:

    File.WriteAllText(Server.MapPath("~/XML"), xDOC);
    

    【讨论】:

      【解决方案3】:

      File.Create 方法将返回一个FileStream,让您可以写入文件。你没有使用它。因此,文件已打开并锁定给你写,因此,你的下一条语句失败了。

      但是,您根本不需要File.Create

      http://msdn.microsoft.com/en-us/library/ms143375.aspx

      Creates a new file, writes the specified string to the file, and then closes the file. If the target file already exists, it is overwritten.
      

      File.WriteAllText 将免费为您处理创建(但它已被覆盖,因此有一个警告)。

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多