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

7
задан Kiril 23 April 2010 в 20:49
поделиться

4 ответа

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 , что вы должны сделать, чтобы убедиться, что соединение с пул соединений.

17
ответ дан 6 December 2019 в 06:02
поделиться

похоже, что File.Create возвращает открытый объект FileStream

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

попробуйте

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

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

6
ответ дан 6 December 2019 в 06:02
поделиться

Проблема в том, что метод 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); 
} 
4
ответ дан 6 December 2019 в 06:02
поделиться

Первое. File.Create вернет поток, который вы должны использовать для доступа к файлу.

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

3
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: