Как очистить содержимое файла?


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 02

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

Олив, если он отвечает на ваш вопрос, не могли бы вы отметить его как ответ. Однако, если предложенное решение не работает в вашем случае, сообщите нам об этом даже тогда.
Abhay Jain

5
+1 Это единственный способ сначала получить блокировку файла, безопасно проверить атрибуты файла и, наконец, очистить содержимое.
mafu

1
Это именно то, в чем я нуждался сам ... мне нужно, чтобы служба связывалась с приложением для простых построчных сообщений пользователю, и это позволяет мне сохранять блокировку файла и очищать сообщения, чтобы предотвратить приложение службы от вставки и непреднамеренного отбрасывания сообщений или дублирования сообщений.
phillk6751 05

2
Разве не было бы целесообразно создать файловый поток в блоке using? Это также автоматически закроет поток.
Wuolennaj

12

Используйте FileMode.Truncateкаждый раз при создании файла. Также поместите File.Createвнутрь файл try catch.


2

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


1
Проблемы могут возникнуть, если вы попытаетесь создать файл вскоре после удаления. Иногда ОС не может создать файл, поскольку она «думает», что файл все еще существует.
Дмитрий Лобанов

@ Дмитрий Лобанов - [я знаю, что это старая ветка]. Я не согласен с тем, что операционная система иногда думает, что файл все еще существует, если для этого нет веской причины. Если бы это было так, это была бы очень плохая ОС. НАМНОГО более вероятно, что что-то еще имеет дескриптор существующего файла. Это может быть даже ваше собственное программное обеспечение, если вы не будете осторожны при закрытии файлов (например, используя "using" для обеспечения удаления). Может быть, и антивирус. Однако согласитесь с вашим выводом. Я думаю, что FileMode.Truncate - это то, что вам нужно.
Стив Кидд,

2

Самый простой способ:

File.WriteAllText(path, string.Empty)

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

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

1

Попробуйте использовать что-нибудь вроде

File.Create

Создает или перезаписывает файл по указанному пути.


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