2010-09-06 8 views
39

używałem następujące zapisu do pliku:File.OpenWrite dołącza zamiast wycierać zawartość?

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

zauważyłem, że było to po prostu zapis do pliku plik poprawnie, ale nie wycierać zawartość pliku jako pierwszy. I wtedy postanowił po prostu użyć:

File.WriteAllBytes(FileName, Contents); 

To działało w porządku.

Dlaczego plik File.OpenWrite nie usuwa automatycznie treści pliku, ponieważ inne języki, z których korzystałem, mają funkcję stylu OpenWrite i zamiast się uzupełniają?

Czy jest jakaś metoda to zrobić?

+0

zawsze możesz użyć http://msdn.microsoft.com/en-us/library/5h0z48dh.aspx – Andrey

Odpowiedz

65

Jest to określone zachowanie dla File.OpenWrite:

Jeśli plik istnieje, to jest otwarty do zapisu na początku. Istniejący plik nie jest obcięty.

Aby zrobić to, co jesteś po prostu zrobić:

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

Aktualna wywołanie jest równoważne użyciu FileMode.OpenOrCreate, który nie powoduje skrócenie istniejącego pliku.

Opcja FileMode.Create spowoduje, że metoda Plik utworzy nowy plik, jeśli nie istnieje, lub skorzysta z FileMode.Truncate, jeśli to zrobi, dając pożądane zachowanie. Alternatywnie możesz użyć polecenia File.Create, aby wykonać to bezpośrednio.

+0

Po prostu pomyślałem, że jest to trochę niepotrzebna rozbieżność w większości bibliotek IO, z których korzystałem, które zwykle mają pisanie jako nadpisywanie mają inną metodę dołączania. Dzięki za informację, jak właściwie otworzyć i wyczyścić, bardzo docenione. – Blam

+0

@Blam: Bez problemu. W .NET, Open, Create i Thruncate wszystkie mają unikalne znaczenia (dlatego próbowałem odpowiedzieć na to, pokazując FileModes, ponieważ to jest naprawdę jedyne miejsce, które wymienia je wszystkie wyraźnie). Cieszę się, że to pomaga :) –

15

Tak, masz rację. File.OpenWrite nie zastępuje pliku.

Plik File.Create służy do nadpisania pliku, jeśli istnieje.

+0

To jest poprawna odpowiedź. Choćby rozszerzyć go na przykład ... 'Plik.Open (, FileMode.Create, FileAccess.Write)' Opcjonalnie można użyć czwartego argumentu, aby określić, jaki rodzaj wyłącznego blokowania, jeśli w ogóle, chcę na pliku. Domyślnie nie można nawet otworzyć pliku w celu odczytania w innym programie. Na przykład. 'Plik.Open (, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)' – TomWardrop

Powiązane problemy