2010-09-06 5 views
39

я использовал следующие записи в файл:Файл.OpenWrite добавляет вместо очистки содержимое?

using(Stream FileStream = File.OpenWrite(FileName)) 
    FileStream.Write(Contents, 0, Contents.Length); 

я заметил, что это было просто писать правильно подать файл, но не вытирать содержимое файла первым. Затем я решил просто использовать:

File.WriteAllBytes(FileName, Contents); 

Это прекрасно работало.

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

Есть ли способ для этого?

+0

Вы всегда можете использовать http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx – Andrey

ответ

65

Это заданное поведение для File.OpenWrite:

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

Чтобы сделать то, что вы после этого, просто сделать:

using(Stream fileStream = File.Open(FileName, FileMode.Create)) 
    fileStream.Write(Contents, 0, Contents.Length); 

Ваш текущий вызов эквивалентен использовать FileMode.OpenOrCreate, который не вызывает усечения существующего файла.

Опция FileMode.Create заставит метод File создать новый файл, если он не существует, или использовать FileMode.Truncate, если это так, что дает вам желаемое поведение. Кроме того, вы можете использовать File.Create, чтобы сделать это напрямую.

+0

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

+0

@Blam: Нет проблем. В .NET, Open, Create и Truncate все имеют уникальные значения (вот почему я попытался ответить на него, показывая FileModes, так как это действительно единственное место, в котором они четко перечислены). Рад, что это помогает :) –

15

Да, вы правы. File.OpenWrite не перезаписывает файл.

File.Create предназначен для перезаписи файла, если он существует.

+0

Это правильный ответ. Хотя продлить его с помощью примера ... 'File.Open (, FileMode.Create, FileAccess.Write)' При необходимости вы можете использовать 4-й аргумент, чтобы определить, какой именно исключительный замок, если таковой имеется, хочу в файле. По умолчанию вы даже не сможете открыть файл для чтения в другой программе. Например. 'File.Open (, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)' – TomWardrop

Смежные вопросы