[英]C# File Exception: cannot access the file because it is being used by another process
我正在尝试从网上下载文件并将其保存在本地,但出现异常:
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连接到Web。
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
,您应该这样做以确保将连接释放到连接池中。
看起来像File.Create返回一个打开的FileStream对象
http://msdn.microsoft.com/zh-CN/library/aa328775(v=VS.71).aspx
尝试
using (FileStream fs = File.Create("data.csv"))
并保留第一个File.Create
问题在于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);
}
第一。 File.Create将返回用于访问文件的流。
其次,如果那不能解决问题,那么如果您用谷歌who lock
您,您将找到一个程序,让您确定同时正在访问文件的进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.