Jak mogę wyczyścić zawartość pliku?


80

Muszę wyczyścić zawartość określonego pliku za każdym razem, gdy uruchamiają się aplikacje. Jak mam to zrobić?

Odpowiedzi:


131

Możesz użyć metody File.WriteAllText .

System.IO.File.WriteAllText(@"Path/foo.bar",string.Empty);

Mam plik z dowiązaniem twardym i File.WriteAllTextwydaje się, że czasami (?) Usuwa to plik, ponieważ dowiązania twarde nie są aktualizowane.
Ciantic

1
Zalecam, aby tego nie robić, jeśli inna operacja uzyska dostęp do pliku bezpośrednio po tej operacji. Napotkałem problem polegający na tym, że plik nie został zamknięty, pisz po tej linii kodu i spowodował IO exceptions of file is in use, że
radzę

84

Oto, co zrobiłem, aby wyczyścić zawartość pliku bez tworzenia nowego pliku, ponieważ nie chciałem, aby plik wyświetlał nowy czas tworzenia, nawet gdy aplikacja właśnie zaktualizowała swoją zawartość.

FileStream fileStream = File.Open(<path>, FileMode.Open);

/* 
 * Set the length of filestream to 0 and flush it to the physical file.
 *
 * Flushing the stream is important because this ensures that
 * the changes to the stream trickle down to the physical file.
 * 
 */
fileStream.SetLength(0);
fileStream.Close(); // This flushes the content, too.

Użyłem .NET 3.5, na wypadek gdybyś chciał poznać wersję.
Abhay Jain

Olive, jeśli odpowiada na Twoje pytanie, czy mógłbyś oznaczyć je jako odpowiedź. Jeśli jednak proponowane rozwiązanie nie zadziała w Twoim przypadku, daj nam znać już wtedy.
Abhay Jain

5
+1 To jedyny sposób, aby najpierw uzyskać blokadę pliku, bezpiecznie sprawdzić atrybuty pliku i ostatecznie wyczyścić zawartość.
mafu

1
To jest dokładnie to, czego sam potrzebowałem ... potrzebuję, aby usługa komunikowała się z aplikacją w celu wysyłania prostych wiadomości do użytkownika, a to pozwala mi zablokować mój plik i wyczyścić komunikaty, aby zapobiec aplikacji usługi przed wstawianiem i nieumyślnym upuszczaniem lub kopiowaniem wiadomości.
phillk6751

2
Czy nie byłoby wskazane utworzenie strumienia plików w bloku using? To również automatycznie zamknęło strumień.
Wuolennaj

12

Użyj FileMode.Truncateza każdym razem, gdy tworzysz plik. Umieść również File.Createwnętrze a try catch.


2

Najprostszym sposobem na to jest prawdopodobnie usunięcie pliku za pośrednictwem aplikacji i utworzenie nowego o tej samej nazwie ... w jeszcze prostszy sposób wystarczy, że aplikacja nadpisze go nowym plikiem.


1
Mogą wystąpić problemy, jeśli spróbujesz utworzyć plik wkrótce po usunięciu. Czasami system operacyjny nie tworzy pliku, ponieważ „uważa”, że plik nadal istnieje.
Dmitrii Lobanov

@Dmitry Lobanov - [Wiem, że to stary wątek]. Nie zgadzam się, że system operacyjny czasami myśli, że plik nadal istnieje, chyba że istnieje dobry powód. Gdyby tak było, byłby to bardzo kiepski system operacyjny. DUŻO bardziej prawdopodobne jest, że coś nadal ma otwarty uchwyt do istniejącego pliku. Może to być nawet Twoje własne oprogramowanie, jeśli nie będziesz ostrożny podczas zamykania plików (używając na przykład opcji „using” w celu usunięcia). To może być również antywirus. Zgadzam się jednak z wnioskiem. Myślę, że FileMode.Truncate jest drogą do zrobienia.
Steve Kidd

2

Najłatwiej jest:

File.WriteAllText(path, string.Empty)

Polecam jednak używać, FileStreamponieważ pierwsze rozwiązanie może rzucićUnauthorizedAccessException

using(FileStream fs = File.Open(path,FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
     lock(fs)
     {
          fs.SetLength(0);
     }
}

1

Spróbuj użyć czegoś takiego jak

File.Create

Tworzy lub zastępuje plik w określonej ścieżce.


Nie jest to dobry pomysł na zadane pytanie: nie usuwa danych już znajdujących się w pliku - tylko nadpisuje je do długości nowych danych, więc jeśli stare dane> nowe dane, skończysz z mieszanką tych dwóch.
namford
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.