C#文件异常:无法访问该文件,因为它正由另一个进程使用

时间:2010-04-23 20:10:31

标签: c# exception file file-io

我正在尝试从网上下载文件并将其保存在本地,但我得到一个例外:

  

C#进程无法访问该文件   'blah'因为它被使用了   另一个过程。

这是我的代码:

File.Create("data.csv");  // create the file
request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
request.Timeout = 30000;
response = (HttpWebResponse)request.GetResponse();

using (Stream file = File.OpenWrite("data.csv"), // <-- Exception here
    input = response.GetResponseStream())
{
    // Save the file using Jon Skeet's CopyStream method
    CopyStream(input, file);
}

我在同样的例外中看到了许多其他问题,但这些问题似乎都不适用于此。有什么帮助吗?

更新
谢谢你的回答!正在删除File.Create(...)修复它!

关于OpenWrite文档的一条评论:这有点误导,简要说明:

  

打开现有文件进行书写。

详细说明如下:

  

如果文件存在,则打开它   写在开头。现有的   文件没有被截断。

更新2.0:
看起来像IntelliSense / F1和在线文档之间的差异。我认为它应该是相同的,因为我允许F1在显示文档时连接到网络。

4 个答案:

答案 0 :(得分:17)

File.Create会返回FileStream - 您尚未关闭。这意味着在终结器关闭现有流之前,您将无法打开另一个流写入同一文件。

只需摆脱对File.Create的调用 - File.OpenWrite无论如何都会创建它。或者,保持FileStream左右写入:

using (Stream file = File.Create("data.csv"))
{
    request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
    request.Timeout = 30000;
    using (var response = (HttpWebResponse)request.GetResponse())
    using (Stream input = response.GetResponseStream())
    {
        // Save the file using Jon Skeet's CopyStream method
        CopyStream(input, file);
    }
}

请注意,我还在这里处理WebResponse,您应该这样做以确保连接释放到连接池。

答案 1 :(得分:6)

看起来像File.Create返回一个打开的FileStream对象

http://msdn.microsoft.com/en-us/library/aa328775(v=VS.71).aspx

using (FileStream fs = File.Create("data.csv"))

并取消第一个File.Create

答案 2 :(得分:4)

问题是File.Create方法实际打开文件并返回FileStream对象。在对象被垃圾收集之前它不会关闭文件(这将在不确定的时间发生)。无论您是否使用它,仍会创建FileStream对象。试试这个:

using (Stream file = File.Create("data.csv"),
    input = response.GetResponseStream()) 
{ 
    // Save the file using Jon Skeet's CopyStream method 
    CopyStream(input, file); 
} 

答案 3 :(得分:3)

首先。 File.Create将返回您应该用于访问文件的流。

其次,如果这不能解决问题,那么如果您使用Google who lock,您会找到一个程序,让您可以确定同时访问文件的进程。