Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将巨大字符串写入文件的最佳方法_C#_String_File_Stream - Fatal编程技术网

C# 将巨大字符串写入文件的最佳方法

C# 将巨大字符串写入文件的最佳方法,c#,string,file,stream,C#,String,File,Stream,在C语言中,我读取一个大小适中的文件100KB~1MB,修改部分内容,最后写入另一个文件。所有内容均为文本。修改是作为字符串对象和字符串操作完成的。我目前的做法是: 使用StreamReader从原始文件中读取每一行。 为新文件的内容打开StringBuilder。 修改字符串对象并调用StringBuilder的AppendLine,直到文件结束 打开新的StreamWriter,并将StringBuilder写入写入流。 但是,我发现StremWriter.Write会截断32768字节2^

在C语言中,我读取一个大小适中的文件100KB~1MB,修改部分内容,最后写入另一个文件。所有内容均为文本。修改是作为字符串对象和字符串操作完成的。我目前的做法是:

使用StreamReader从原始文件中读取每一行。 为新文件的内容打开StringBuilder。 修改字符串对象并调用StringBuilder的AppendLine,直到文件结束 打开新的StreamWriter,并将StringBuilder写入写入流。 但是,我发现StremWriter.Write会截断32768字节2^16,但StringBuilder的长度大于此值。我可以编写一个简单的循环来保证将整个字符串保存到一个文件中。但是,我想知道在C语言中,完成这项任务最有效的方法是什么

总而言之,我只想修改文本文件的某些部分,然后写入另一个文件。但是,文本文件大小可能大于32768字节

我很抱歉让你困惑!只是我没有打电话给同花顺。StremWriter.Write没有短字符,例如2^16限制。

您能试试这个吗:

    void Test()
    {
        using (var inputFile = File.OpenText(@"c:\in.txt"))
        {
            using (var outputFile = File.CreateText(@"c:\out.txt"))
            {
                string current;
                while ((current = inputFile.ReadLine()) != null)
                {
                    outputFile.WriteLine(Process(current));
                }
            }
        }
    }

    string Process(string current)
    {
        return current.ToLower();
    }

它避免了在内存中加载完整的文件,通过逐行处理并直接写入,而不是通过hole dokument运行,我将使用正则表达式查找您要查找的示例:

public List<string> GetAllProfiles()
    {
        List<string> profileNames = new List<string>();
        using (StreamReader reader = new StreamReader(_folderLocation + "profiles.pg"))
        {
            string profiles = reader.ReadToEnd();
            var regex = new Regex("\nname=([^\r]{0,})", RegexOptions.IgnoreCase);
            var regexMatchs = regex.Matches(profiles);
            profileNames.AddRange(from Match regexMatch in regexMatchs select regexMatch.Groups[1].Value);
        }
        return profileNames;
    }

这完全取决于你想修改什么。如果您对文本文件一部分的修改依赖于文本文件的另一部分,那么显然需要将这两部分都存储在内存中。但是,如果您只需要逐行修改文本文件,则可以使用以下方法:

using (StreamReader sr = new StreamReader(@"test.txt"))
{
    using (StreamWriter sw = new StreamWriter(@"modifiedtest.txt"))
    {
        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            //do some modifications
            sw.WriteLine(line);
            sw.Flush(); //force line to be written to disk
        }
    }
}
流作者,写吧

不 截断字符串并且没有限制


在内部,它使用String.CopyTo,而另一方面,它使用不安全的代码,使用fixed to copy chars,因此它是最有效的。问题很可能与未关闭写入程序有关。看


但是,如果可以避免的话,我建议不要将整个文件加载到内存中。

我认为使用字符串生成器是更好的方法,您是刷新还是关闭StreamWriter?关闭writer时会自动调用flush,这是您真正应该做的。要关闭写入程序,应调用Dispose而不是close,以便释放非托管资源。最好的方法是使用using语句。所以。。。修复程序是否仍在调用Flush,还是其他方法起作用?有一个片段吗?我在HttpModule中遇到了相同的问题。没关系。。。我刚试过。成功了!