Подтвердить что ты не робот

Почему File.Create необходимо закрыть?

Следующее выдает исключение "The process cannot access the file 'D:\MyDir\First.txt' because it is being used by another process."

static void Main(string[] args)
{
    Directory.CreateDirectory(@"D:\MyDir");
    File.Create(@"D:\MyDir\First.txt");
    File.WriteAllText(@"D:\MyDir\First.txt", "StackOverflow.com");
}

Однако следующие работы:

using (File.Create(@"D:\MyDir\First.txt"))
{ 
}

или

File.Create(@"D:\MyDir\First.txt").Close();

Почему? Что нужно сделать в File.Create?

4b9b3361

Ответ 1

File.Create делает больше, чем вы думаете здесь. Это не просто создание файла, но и возвращение активного потока в файл. Однако вы ничего не делаете с этим потоком. Блок using в вашем последнем примере закрывает этот поток, удаляя его.

Обратите также внимание на то, что это важный ключ к возвращаемому значению:

File.Create(@"D:\MyDir\First.txt").Close();

(На самом деле это было неинтуитивно для меня, когда я впервые прочитал ваш вопрос, но, оглядываясь на него, эта строка кода на самом деле говорит все.)

Следующий шаг, вызывающий File.WriteAllText также делает больше, чем вы думаете. Согласно документации, он:

Создает новый файл, записывает указанную строку в файл и закрывает файл.

Итак, кажется, что ваш вызов File.Create действительно не нужен здесь.

Ответ 2

Поскольку он открывает поток файлов, который является классом, управляющим некоторыми низкоуровневыми ресурсами операционной системы, и они должны быть выпущены для того, чтобы другие операции в других потоках и даже в других приложениях имели доступ к файлу.

Ответ 3

Документы MSDN для File.Create() объясняют это:

Объект FileStream, созданный этим метод имеет значение по умолчанию FileShare of None; никакой другой процесс или код не могут доступ к созданному файлу до оригинальный дескриптор файла закрыт.

В принципе, пока файл не будет закрыт, файл не сможет получить доступ другим процессом (в этом случае ваша попытка записать на него).

Ответ 4

На самом деле вам не нужно вызывать File.Create(), чтобы позвонить File.WriteAllText().

File.WriteAllText() создаст новый файл и напишет в него, а затем закроет файл всего одним удобным способом.

Если файл уже существует, он будет перезаписан.

Ответ 5

File.Create(string) возвращает объект FileStream, в котором файл открыт. Несмотря на то, что вы не сохраняете ссылку на объект FileStream в переменной, она все еще существует. Объект подходит для сбора мусора, и когда это произойдет, файл будет закрыт, но предсказать, когда будет собираться сборка мусора, не будет.