Я пытаюсь загрузить файл с сети и сохранить ее локально, но я получаю исключение:
C# процесс не может получить доступ к файлу 'вздор', потому что он используется другим процессом.
Это - мой код:
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 соединяться с сетью, когда это отображает документацию.
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/en-us/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
, вы найдете программу, которая позволит вам определить, какой процесс одновременно обращается к файлу.