Полная перезапись файла с помощью Velocity / NVelocity

Я пытаюсь использовать шаблоны NVelocity в приложении .Net: используя шаблон для вывода результатов в файл. Кажется, все работает нормально, за исключением того факта, что вывод никогда не перезаписывается полностью. Если мой файл имеет длину 100 символов, а шаблон отображает только 20 символов, последние 80 символов никогда не изменяются!

Пример кода:

        FileStream fileStream = new FileStream(outputPath, FileMode.OpenOrCreate, FileAccess.Write);

        using (StreamWriter streamWriter = new StreamWriter(fileStream))
        {
            velocityEngine.MergeTemplate(templateName, Encoding.Default.WebName, velocityContext, streamWriter);
        }

Итак, если мой шаблон выводит AAAA, а файл уже содержит BBBBBBBB, то в конце файл содержит AAAABBBB в конце операции.

Любая подсказка, как я могу полностью перезаписать файл? - например, в приведенном выше примере окончательный результат должен быть AAAA. Не уверен, что это просто связанная с потоком информация, но раньше у меня не было этой проблемы с файловыми потоками.

Счастлив написать метод сброса или просто вывести в поток памяти и перезаписать файл, но я бы хотел, чтобы он работал так, если это возможно! ** Обновлено: '' заработал, позвонив

 fileStream.SetLength(0);

когда я открываю файл. Но был бы признателен, если бы был лучший способ!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 390
2

Ответы 2

Я думаю, решение состоит в том, чтобы заменить FileMode.OpenOrCreate на просто FileMode.Create в первой строке.

Из статьи MSDN о System.IO.FileMode ..

FileMode.Create Specifies that the operating system should create a new file. If the file already exists, it will be overwritten.

FileMode.OpenOrCreate Specifies that the operating system should open a file if it exists; otherwise, a new file should be created.

Если во время открытия вы не знаете, что вы можете обрезать файл, вы можете использовать метод SetLength в Stream, чтобы обрезать его. http://msdn.microsoft.com/en-us/library/system.io.stream.setlength.aspx

Чтобы это работало, Stream должен быть доступен для записи и поиска.

Другие вопросы по теме