C# 使用StreamReader和StreamWriter读取和替换字符串时OutofMemory异常

C# 使用StreamReader和StreamWriter读取和替换字符串时OutofMemory异常,c#,streamreader,streamwriter,C#,Streamreader,Streamwriter,我正在尝试转换文件的编码,并在此过程中替换一些文本。不幸的是,我得到了一个OutOfMemory异常。我不知道为什么。据我所知,它将原始文件逐行流式传输到var(str)中,完成两个字符串替换,然后将转换后的行写入StreamWriter 有人能告诉我我做错了什么吗 编辑1 -我目前正在测试一个文件-1GB:250万行。 -将read和replace替换为一行。同样的结果 编辑2 ?顺便问一下,有人能告诉我为什么这个问题被降级了吗?我想知道将来的职位 问题在于文件本身。它是SQLServerBC

我正在尝试转换文件的编码,并在此过程中替换一些文本。不幸的是,我得到了一个OutOfMemory异常。我不知道为什么。据我所知,它将原始文件逐行流式传输到var(str)中,完成两个字符串替换,然后将转换后的行写入StreamWriter

有人能告诉我我做错了什么吗

编辑1 -我目前正在测试一个文件-1GB:250万行。 -将read和replace替换为一行。同样的结果

编辑2

?顺便问一下,有人能告诉我为什么这个问题被降级了吗?我想知道将来的职位

问题在于文件本身。它是SQLServerBCP的输出,我在其中使用特定字符串显式标记行终止符。默认情况下,当省略行终止符标志时,BCP会在每行的末尾添加一个换行符,下面的代码可以正常工作

我仍然不明白的是:当我用一个特定的字符串设置行终止符标志时,每条记录都出现在一个换行符上,那么为什么streamreader不能在单独的一行上看到每条记录呢?相反,它似乎将整个文件视为一条长线。这仍然不能解释OOM异常,因为我有超过100克的内存

不幸的是,必须显式设置行终止符标志。现在,我将把这个交给dba exchange

谢谢

static void Main(string[] args)
    {           
        String msg = String.Empty;
        String str = String.Empty;
        DirectoryInfo dInfo = new DirectoryInfo(@"\\server\share");
        foreach (var f in dInfo.GetFiles())
        {
            using (StreamReader sr = new StreamReader(f.FullName, Encoding.Unicode, false))
            {
                using (StreamWriter sw = new StreamWriter(f.DirectoryName + "\\new\\" + f.Name, false, Encoding.UTF8))
                {
                    try
                    {    
                        while (!sr.EndOfStream)
                        {
                            str = sr.ReadLine().Replace("this","that");
                            sw.WriteLine(str);
                        }
                    }
                    catch (Exception e)
                    {
                        msg += f.Name + ": " + e.Message;
                    }
                }
            }
        }
        Console.WriteLine(msg);
        Console.ReadLine();                
    }

好吧,你主要的读写代码只需要一行数据。另一方面,您的
msg
字符串会随着每次异常而变得越来越大


但是,要以这种方式获得OutOfMemory异常,文件夹中需要有数百万个文件。

目录中的文件有多大?根据这段代码,这不是您的答案,但str.Replace的输出需要分配给另一个字符串。替换不到位。@Steve-谢谢。我将其更新为一行,但结果仍然相同。只是为了隔离问题。如果你拆下替换件,你还存在问题吗?的确!但是,如果我的代码是正确的,那么异常会非常少。你有很多异常吗?没有!就是那个杀死它的。进程的内存使用情况如何?你可能需要去找约翰·罗宾斯并使用windbg。