c#更改文件编码而不加载内存中的所有文件
c# change file encoding without loading all the file in memory
我需要更改文件的编码。我使用的方法将所有文件加载到内存中:
string DestinationString = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(File.ReadAllText(FileName)));
File.WriteAllText(FileName, DestinationString, new System.Text.ASCIIEncoding());
这适用于较小的文件(如果我想将文件的编码更改为 ASCII
),但它不适用于大于 2 GB 的文件。如何在不将所有文件内容加载到内存的情况下更改编码?
您不能通过写入 相同的 文件来做到这一点 - 但您可以轻松地将其写入 不同的 文件,只需通过一次以一种编码读取一大块字符并以目标编码写入每个字符块。
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);
}
}
}
}
当然,您始终可以通过重命名以原始文件名结束。
我需要更改文件的编码。我使用的方法将所有文件加载到内存中:
string DestinationString = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(File.ReadAllText(FileName)));
File.WriteAllText(FileName, DestinationString, new System.Text.ASCIIEncoding());
这适用于较小的文件(如果我想将文件的编码更改为 ASCII
),但它不适用于大于 2 GB 的文件。如何在不将所有文件内容加载到内存的情况下更改编码?
您不能通过写入 相同的 文件来做到这一点 - 但您可以轻松地将其写入 不同的 文件,只需通过一次以一种编码读取一大块字符并以目标编码写入每个字符块。
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);
}
}
}
}
当然,您始终可以通过重命名以原始文件名结束。