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

Kir*_*ril 7 c# file-io exception file

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

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);
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了许多其他相同例外的问题,但它们似乎都不适用于此.有帮助吗?

更新:
谢谢你的回答!卸下File.Create(...)固定它!

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

打开现有文件进行写入.

详细说明如下:

如果文件存在,则打开它以便在开头写入.现有文件未被截断.

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

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


hou*_*se9 6

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

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

尝试

using (FileStream fs = File.Create("data.csv"))
Run Code Online (Sandbox Code Playgroud)

并取消第一个File.Create