Полностью перезаписать файл с Velocity / NVelocity - PullRequest
1 голос
/ 30 декабря 2008

Я пытаюсь использовать шаблоны 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);

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

Ответы [ 2 ]

2 голосов
/ 09 января 2009

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

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

FileMode.Create Указывает, что операционная система должна создать новый файл. Если файл уже существует, он будет перезаписан.

FileMode.OpenOrCreate Указывает, что операционная система должна открыть файл, если он существует; в противном случае должен быть создан новый файл.

0 голосов
/ 20 февраля 2009

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

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

...