Почему 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
?
Ответы
Ответ 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 в переменной, она все еще существует. Объект подходит для сбора мусора, и когда это произойдет, файл будет закрыт, но предсказать, когда будет собираться сборка мусора, не будет.