c#更改文件编码而不加载内存中的所有文件

时间:2016-03-11 06:49:03

标签: c# file-encodings

我需要更改文件的编码。我使用的方法加载内存中的所有文件:

string DestinationString = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(File.ReadAllText(FileName)));
File.WriteAllText(FileName, DestinationString, new System.Text.ASCIIEncoding());

这适用于较小的文件(如果我想将文件的编码更改为ASCII),但对于大于2 GB的文件,它不会没问题。如何在不加载内存中所有文件内容的情况下更改编码?

1 个答案:

答案 0 :(得分:3)

您不能通过写入相同的文件来执行此操作 - 但您可以轻松地将其添加到不同的文件中,只需读取一大块字符即可在一次编码中编写时间并在目标编码中写入每个块。

public void RewriteFile(string source, Encoding sourceEncoding,
                        string destination, Encoding destinationEncoding)
{
    using (var reader = File.OpenText(source, sourceEncoding))
    {
        using (var writer = File.CreateText(destination, destinationEncoding))
        {
            char[] buffer = new char[16384];
            int charsRead;
            while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
            {
                writer.Write(buffer, 0, charsRead);
            }
        }
    }
}

当然,你总是可以通过重命名来获得原始文件名。