【问题标题】:Completely overwriting a file with Velocity / NVelocity使用 Velocity / NVelocity 完全覆盖文件
【发布时间】:2009-02-20 16:08:49
【问题描述】:

我正在尝试在 .Net 应用程序中使用 NVelocity 模板:使用模板将结果输出到文件。除了输出永远不会被完全覆盖之外,这一切似乎都运行良好。如果我的文件有 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);

当我打开文件时。但如果有更好的方法,将不胜感激!

【问题讨论】:

    标签: c# filestream velocity nvelocity


    【解决方案1】:

    我认为解决方案是将第一行中的FileMode.OpenOrCreate 更改为简单的FileMode.Create

    来自 System.IO.FileMode.. 上的 MSDN 文章。

    文件模式.创建 指定操作系统应该创建一个新文件。如果文件已经存在,则会被覆盖。

    FileMode.OpenOrCreate 指定操作系统应该打开一个文件(如果存在);否则,应创建一个新文件。

    【讨论】:

      【解决方案2】:

      如果您在打开时不知道您可能会截断文件,您可以使用 Stream 上的 SetLength 方法来截断它。
      http://msdn.microsoft.com/en-us/library/system.io.stream.setlength.aspx

      为此,流必须是可写和可查找的。​​p>

      【讨论】:

        猜你喜欢
        • 2019-09-18
        • 2016-03-23
        • 1970-01-01
        • 2014-08-19
        • 2013-05-01
        • 2017-12-22
        • 2019-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多