В .Net использование File.CreateText () также блокирует файл, почему?

Я использовал метод CreateText для создания пустого файла (как показано ниже) в «App1». Затем попытался заставить другое приложение записать в этот файл, но это не удалось, потому что оно было заблокировано. Не было разблокировано, пока я не закрыл "App1"

File.CreateText(path)

Чтобы исправить это, я могу сделать следующее:

Dim sw As StreamWriter = File.CreateText(path)
sw.Close()

Почему вызов только CreateText блокирует файл? Создается ли какой-нибудь неявный стримрайтер или файлрайтер или что-то еще?

теп


person Gern Blanston    schedule 03.02.2010    source источник
comment
После повторного поиска я нашел этот связанный с Stackoverflow вопрос: stackoverflow.com/questions/802541/creating-an-empty-file-in-c   -  person Gern Blanston    schedule 03.02.2010


Ответы (8)


Да. CreateText() возвращает объект StreamWriter, который открыт для указанного вами файла.

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

person womp    schedule 03.02.2010
comment
Ой, это нас долгое время убивало из-за надоедливой ошибки. Мы безуспешно использовали мьютексы и проверяли исключения, когда это было просто потому, что мы не удаляли StreamWriter ... - person MattGWagner; 05.07.2011

Создается ли какой-нибудь неявный стримрайтер или файлрайтер или что-то еще?

Создается StreamWriter, как демонстрирует ваш собственный код. Вот почему вы можете присвоить возвращаемое значение переменной типа StreamWriter.

Это самый простой из известных мне способов создать пустой файл:

File.CreateText(path).Close()

ИЗМЕНИТЬ:

Протестировано и подтверждено, что работает.

person Andy West    schedule 03.02.2010

CreateText() создает файл, а затем возвращает StreamWriter, чтобы при необходимости можно было продолжить запись в файл.

Чтобы закрыть файл, вы должны явно закрыть файл (как в вашем примере).

person Justin Niessner    schedule 03.02.2010

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

File.WriteAllBytes(path, new byte[0]);
person Rubens Farias    schedule 03.02.2010

File.CreateFile через StreamWriter вызывает конструктор FileStream, передавая FileMode.Create, FileAccess.Write и FileShare.Read. Это очень нормальный способ создания файлов, доступа к ним и обмена ими. Вам определенно понадобится доступ на запись, поскольку вы только что создали файл. И для других процессов вполне нормально читать файл, пока вы его пишете, ничего плохого не происходит, когда они это делают.

То, о чем вы просите, возможно, но вы не можете использовать File.CreateFile (). Сначала вам нужно создать FileStream (Create, Write и FileShared.ReadWrite) и передать его конструктору StreamWriter. Теперь файл может быть записан как вами, так и другим процессом.

Что довольно сложно, предположим, что вы и какой-то другой процесс одновременно записываете в файл. Это в порядке очереди, в конечном итоге файл будет содержать выходные данные вашей программы, случайным образом смешанные с выходными данными другого процесса. Маловероятно, что файл будет доступен для чтения после этого.

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

person Hans Passant    schedule 03.02.2010

Да, StreamWriter создан. См. документацию. Я предлагаю, чтобы первая программа записывала в файл, создавая его.

person Matthew Flaschen    schedule 03.02.2010

Я думаю, что самое простое решение - создать функцию-оболочку, которая создает и закрывает за вас.

Module Tools
  Sub CreateTextNoLock(ByVal text as String)
    Dim sw = File.CreateText(text)
    sw.Close
  End Sub
End Module
person JaredPar    schedule 03.02.2010

Вам нужно заключить StreamWriter в блок using, чтобы охватить его после вызова закрытия. Это заставит его вызвать его dispose (закрыть его), а затем отключить его как ссылку и «отправить» его в сборщик мусора.

Using sw As StreamWriter = File.CreateText(path)
    sw.Write("")
End Using
person Joel Etherton    schedule 03.02.2010