我正在尝试从网上下载文件并将其保存在本地,但我得到一个例外:
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在显示文档时连接到网络。
答案 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
,您会找到一个程序,让您可以确定同时访问文件的进程。