Я пытаюсь использовать шаблоны 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);
когда я открываю файл. Но был бы признателен, если бы был лучший способ!





Я думаю, решение состоит в том, чтобы заменить 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 должен быть доступен для записи и поиска.