System.IO.File.Создать блокировку файла - PullRequest
50 голосов
/ 13 января 2011

Я использую System.IO.File.Create для создания файла.Я не пишу в него с помощью средства записи потоков, я просто создаю его.

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

Теперь я знаю, что если бы я использовал Streamwriter, мне пришлось бы его закрыть.Относится ли то же самое к созданию?

Я читал, что открытие потоковой записи в файл и немедленное закрытие файла это исправит, но это выглядит грязно.Есть ли более простой способ?

Ответы [ 6 ]

96 голосов
/ 16 февраля 2012

Попробуйте это:

System.IO.File.Create(FullFName).Close();
69 голосов
/ 13 января 2011

File.Create возвращает FileStream.Вы должны использовать это так:

using (FileStream fs = File.Create(path))
{
    //you can use the filstream here to put stuff in the file if you want to
}
12 голосов
/ 13 января 2011

Создание файла открывает FileStream к нему, следовательно, блокирует его (File.Create возвращает FileStream).

Вы должны закрыть этот поток, чтобы получить доступ к файлу.Лучше всего это сделать с помощью оператора using:

using(FileStream fs = File.Create(path))
{
}
8 голосов
/ 13 января 2011

При использовании File.Create возвращается FileStream. Пока вы не закроете поток или пока объект FileStream не будет удален (финализатором сборщика мусора), он будет оставаться открытым и заблокированным.

FileStream реализует IDisposable, поэтому вы можете делать следующее:

using(FileStream fs = File.Create(filename))
{
    // Do stuff like write to the file
}

Оператор using является "синтаксическим сахаром" и заставляет компилятор генерировать код, функционально эквивалентный:

FileStream fs = File.Create(filename)
try
{
    // Do stuff like write to the file
}
finally
{
    fs.Dispose();
}

Метод Dispose вызывает Close внутри.

2 голосов
/ 20 декабря 2011

Я использовал: System.IO.File.Create(sFullFileName);

Приведенный выше метод .Create не закрывал файл

Я сейчас использую: System.IO.File.WriteAllText(sFullFileName, "Uploading");

Этот метод создает изакрывает файл (примечание: я поместил в файл строку «Uploading», но я уверен, что string.Empty также будет работать.

1 голос
/ 13 января 2011

Метод Create возвращает дескриптор файла.Дескриптор файла должен быть закрыт перед повторным использованием файла.Подробности см. В статье MSDN File.Create Method (String) .

Сводка:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...