Як я можу очистити вміст файлу?


80

Мені потрібно очищати вміст певного файлу кожного разу, коли запускаються програми. Як це зробити?

Відповіді:


131

Ви можете використовувати метод File.WriteAllText .

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

У мене є файл із твердим посиланням, і використання File.WriteAllText, здається, це іноді (?) Видаляє файл, оскільки жорсткі посилання не оновлюються.
Ciantic

1
Я рекомендую вам цього не робити, якщо інша операція отримає доступ до файлу відразу після цієї операції. Я зіткнувся з проблемою, через яку файл не закрився після цього рядка коду, і причина IO exceptions of file is in use, тому я рекомендую вам обробити це вручну через потік файлів
deadManN

84

Це те, що я зробив, щоб очистити вміст файлу без створення нового файлу, оскільки я не хотів, щоб файл відображав новий час створення, навіть коли програма лише оновила його вміст.

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.

Я використовував .NET 3.5, на випадок, якщо ви хочете дізнатися версію.
Абхай Джейн,

Оливкова, якщо вона відповість на ваше запитання, будь ласка, позначте це як відповідь. Однак, якщо запропоноване рішення не працює у вашому випадку, повідомте нас, навіть тоді.
Abhay Jain

5
+1 Це єдиний спосіб спочатку отримати блокування файлу, безпечно перевірити атрибути файлів і нарешті очистити вміст.
мафу

1
Це якраз те, що мені потрібно було мені ... мені потрібно, щоб служба передавала повідомлення користувачеві для отримання простих рядкових повідомлень, і це дозволяє мені тримати блокування файлу та очищати повідомлення, щоб запобігти застосунку служби від вставки та ненавмисного видалення повідомлень або дублювання повідомлень.
phillk6751

2
Чи не було б доцільно створювати потік файлів у використовуючому блоці? Це також автоматично закриє потік.
Wuolennaj

12

Використовуйте FileMode.Truncateкожен раз, коли створюєте файл. Також розмістіть File.Createвсередині a try catch.


2

Найпростіший спосіб зробити це, можливо, видалити файл через вашу програму та створити новий із таким самим іменем ... ще простішим способом просто зробити так, щоб програма перезаписала його новим файлом.


1
Можуть виникнути проблеми, якщо ви спробуєте створити файл незабаром після видалення. Іноді ОС не вдається створити файл, оскільки "думає", що файл все ще існує.
Дмитро Лобанов

@ Дмитро Лобанов - [Я знаю, це стара тема]. Я не погоджуюся з тим, що операційна система іноді вважає, що файл все-таки існує, якщо немає вагомих причин. Якби це було б дуже поганою ОС. НАБАГАТО вірогідніше, що дещо все ще має дескриптор відкритого для існуючого файлу. Це може бути навіть ваше власне програмне забезпечення, якщо ви не обережно закриваєте файли (наприклад, використовуючи "використання", щоб забезпечити утилізацію). Може бути і антивірусом. Погодьтеся з вашим висновком. Я думаю, що FileMode.Truncate - це шлях.
Steve Kidd

2

Найпростіший спосіб:

File.WriteAllText(path, string.Empty)

Однак я рекомендую вам використовувати, FileStreamоскільки перше рішення може кинутиUnauthorizedAccessException

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

1

Спробуйте використати щось на зразок

Файл. Створити

Створює або перезаписує файл за вказаним шляхом.


Непогана ідея для заданого питання: Не видаляє дані, що вже є у файлі, - він лише перезаписує їх на довжину нових даних, тому, якщо старі дані> нові дані, ви отримаєте поєднання двох.
Намфорд,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.