修改 FileStream

3

我正在开发一个类,用于编辑非常大的文本文件(4Gb以上)。 尽管这可能听起来有点愚蠢,但是我不明白如何在流中修改文本。以下是我的代码:

public long  Replace(String text1, String text2)
{
    long replaceCount = 0;
    currentFileStream = File.Open(CurrentFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);

    using (BufferedStream bs = new BufferedStream(currentFileStream))
    using (StreamReader sr = new StreamReader(bs))  
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (line.Contains(text1))
            {
                line.Replace(text1, text2);

                // Here I should save changed line
                replaceCount++;
            }
        }
    }
    return replaceCount;
}

抱歉,我混淆了你的示例(根本没有写任何内容)和Ehsan Ullah的示例(使用StringBuilder,显然无法处理大文件)。我删除了我的回答。 - Alexei Levenkov
这种情况通常是无法实现的。只有在替换文本与原始文本长度完全相同时才会出现这种非常特殊的情况。文件不允许在文件中间进行插入和删除操作,所以必须完全重写整个文件。如果你需要处理4GB的文本文件,那么你的处理方式可能存在问题。 - Hans Passant
@HansPassant,4GB+的文件不是操作的结果,而是我正在处理现有的大文件... - Sergiu Cojocaru
1个回答

1
你在代码中没有替换任何东西。你应该保存所有文本,然后再次写入文件。例如,
  public long  Replace(String text1, String text2)
 {
  long replaceCount = 0;
   currentFileStream = File.Open(CurrentFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
StringBuilder sb = new StringBuilder();
using (BufferedStream bs = new BufferedStream(currentFileStream))
using (StreamReader sr = new StreamReader(bs))  
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        string textToAdd = line;
        if (line.Contains(text1))
        {
            textToAdd = line.Replace(text1, text2);

            // Here I should save changed line
            replaceCount++;
        }
        sb.Append(textToAdd);
    }
}
using (FileStream fileStream = new FileStream(filename , fileMode, fileAccess))
        {
            StreamWriter streamWriter = new StreamWriter(fileStream);
            streamWriter.Write(sb.ToString());
            streamWriter.Close();
            fileStream.Close();
        }
return replaceCount;

}


无法保存所有文本,磁盘上没有额外文件的空间,因此我只想找到如何在bs Stream中替换更改行的方法。 - Sergiu Cojocaru
在写入新文件之前,您可以删除旧文件。 - Ehsan
@SergiuCojocaru 我认为不可能同时读取和写入。您必须先读取,然后再写入。 - Ehsan
我也曾这样想,但是我在这里发布了,也许有人有解决方法而不需要创建临时文件。 - Sergiu Cojocaru
多GB文本文件并不是什么特别不寻常的事情。例如,可以下载维基百科或美国国家海洋和大气管理局的气象数据、调查数据、Web爬虫日志等等。 - Jim Mischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接