2016-03-11 3 views
1

Мне нужно изменить кодировку файла. Метод, который я использовал загружает все файлы в памяти:C# изменить кодировку файла без загрузки всего файла в память

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

Это работает для файлов меньшего размера (в случае, если я хочу изменить кодировку файла для ASCII), но это не будет хорошо с файлами более 2 ГБ. Как изменить кодировку без загрузки всего содержимого файла в память?

ответ

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); 
      } 
     } 
    } 
} 

Вы всегда можете найти оригинальное имя файла, переименовав его, конечно.

+0

Он отлично работает. Спасибо –

+1

Боковое примечание: очевидно, что можно изменить кодировку * на * ASCII на месте, так как это фиксированная ширина кодирования и не требует больше байтов, чем любая другая кодировка (стоит ли это сделать другую историю) –

+2

@AlexeiLevenkov: Потенциально, но это было бы сложно, поскольку файл может закончиться сокращением. Я определенно поддержал бы тот подход, который я предложил здесь. –

Смежные вопросы