В .Net использование File.CreateText () также блокирует файл, почему? - PullRequest
3 голосов
/ 03 февраля 2010

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

File.CreateText(path)

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

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

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

tep

Ответы [ 8 ]

7 голосов
/ 03 февраля 2010

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

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

5 голосов
/ 03 февраля 2010

Есть какой-то неявный потоковый или автор файла или что-то создается?

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

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

File.CreateText(path).Close()

EDIT :

Проверено и подтверждено к работе.

2 голосов
/ 03 февраля 2010

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

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

1 голос
/ 03 февраля 2010

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

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

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

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

1 голос
/ 03 февраля 2010

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

File.WriteAllBytes(path, new byte[0]);
0 голосов
/ 03 февраля 2010

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

Using sw As StreamWriter = File.CreateText(path)
    sw.Write("")
End Using
0 голосов
/ 03 февраля 2010

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

Module Tools
  Sub CreateTextNoLock(ByVal text as String)
    Dim sw = File.CreateText(text)
    sw.Close
  End Sub
End Module
0 голосов
/ 03 февраля 2010

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

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