Исключений C# файл: не удается получить доступ к файлу, так как он используется другим процессом

Я пытаюсь загрузить файл из интернета и сохранить его локально, но получаю исключение:

В 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 подключаться к интернету, когда он отображает документацию.

4 ответов


File.Create возвращает


выглядит как файл.Create возвращает открытый объект FileStream

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

попробовать

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

и оставьте первый файл.Create


проблема в том, что файл.Метод 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); 
} 

первый. Файл.Создать возвращает поток, который вы должны использовать для доступа к файлу.

во-вторых, если это не решит проблему, если вы Google who lock вы найдете программу, которая позволит вам определить, какой процесс обращается к файлу одновременно.