【问题标题】:Write a file in a certain line without loop在没有循环的特定行中写入文件
【发布时间】:2014-12-15 06:23:31
【问题描述】:

在 c# 中,我想访问文件的某一行以重写它而不更改其余部分。实际上是这样做的:

using (StreamWriter writer = new StreamWriter(myfile))
{
    for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
    {
        if (currentLine == Linetoedit)
        {
             writer.WriteLine(stufftowrite);
             return;
        }
        else
        {
            //do nothing
        }
    }
}

问题是文件可能很大,让我担心系统会因此变慢。有什么解决方案可以避免循环并以更直接的方式访问文件中所需的行?

【问题讨论】:

  • 您的意思是您只想在找到示例中的行后停止循环,或者一般根本没有循环?
  • 如果您使用的是 C# 4.0,这里有一些想法。 stackoverflow.com/questions/1262965/…
  • 我看不到如何使用字典写入文件。我想在某一行写入文件,我已经知道要编辑的行。另一方面,我已经阅读了您提出的帖子,问题是这篇文章是关于如何阅读而不是写作。

标签: c# file streamwriter


【解决方案1】:

听上去,这是不可能的。您不能根据那里的字符随机跳转到某个位置,因此您必须阅读直到找到要替换的行,因此是一个循环。没有循环的唯一方法是,如果行的长度相同,你会说“我想要行号 x”,因此你想寻找x * [line length]。所以这很简单,但也是一个相对受限的设置。

也就是说,如果您只想替换一行,那么无论如何您都可能不得不担心行长。您不能“插入”到流中,只能选择一个起始位置并写出随后的字节。因此,如果您尝试将长度为 40 的行替换为长度为 60 的行,则最终会在下一行中写入 18 (60 - 40 - "\r\n".Length) 个字符。

所以这里基本上有两种情况:

  1. 恒定线长:在流中寻找,否定你的循环
  2. 可变行长:您必须循环,但这没关系,因为无论如何您都必须重写替换行之后的任何数据。

我想我还可以解决第三种情况,即保证替换字符串的长度与原始字符串的长度完全相同。然后你必须只循环到那条线。但这实际上只是上述两者的总和。

显然,有一些更好的方法(可以说)来执行此功能。至少更简单的方法。但我没有得到你在这里要求的印象。

如果您真的非常渴望性能并且文件以某种方式进行了排序或索引,例如,您可以编写一个简单的二进制搜索来搜索文件。尽管对于真正的大文件来说,这只会带来一点好处。

不过,老实说。除非您正在处理一个“真正的大 文件”,否则我会有点惊讶地看到其中的任何一个都需要这么多时间。如果您是,那么可能值得考虑以您可以允许的方式构建您的应用程序。 IO 本质上是昂贵的,因此很难像我们有时想要的那样优化,所以您可能需要一个进度条或等效项来向您的用户显示正在发生的事情。

【讨论】:

  • 感谢您抽出宝贵时间对此进行解释。
【解决方案2】:

您不能在不重写文件其余部分的情况下在文本文件中间插入行。 仅当您使用具有固定长度记录的二进制文件时,才可能进行覆盖。 这是磁盘存储的限制,它在内部将文件存储在块中。

有关详细信息,请参阅以下讨论: Inserting text into file at specific offset using Win32 API

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2012-06-27
    • 2019-01-29
    相关资源
    最近更新 更多