Где вы пишете ASCII.txt? Вы пишете ANSI.txt в первой строке, но это, конечно, не ASCII, поскольку ASCII не содержит символов с акцентом. Файл ANSI не содержит преамбулы, указывающей, что это ANSI, а не ASCII или UTF-8.
Похоже, вы, по сути, передумали между ASCII и ANSI, наполовину написав пример.
Я ожидал бы, что любой файл ASCII будет «обнаружен» как UTF-8, но обнаружение кодирования основывается на том, что файл имеет метку порядка байтов, что-то отличное от UTF-8. Это не значит, что он читает весь файл, а затем догадывается, что такое кодировка.
Из документов для StreamReader:
Этот конструктор инициализирует
кодирование в UTF8Encoding,
Свойство BaseStream с использованием потока
параметр и внутренний буфер
размер по умолчанию.
DetectionEncodingFromByteOrderMarks
параметр определяет кодировку
глядя на первые три байта
поток. Это автоматически
распознает UTF-8, little-endian
Unicode и текст с прямым порядком байтов Unicode
если файл начинается с
соответствующие метки порядка байтов. Увидеть
Метод Encoding.GetPreamble для более
информация.
Теперь File.Copy
просто копирует необработанные байты с места на место - он не должен изменять что-либо с точки зрения кодировки символов, потому что он не пытается интерпретировать файл как текстовый файл во-первых.
Мне не совсем понятно, где вы видите проблему (частично из-за части ANSI / ASCII). Я предлагаю вам выделить вопросы "File.Copy меняет вещи?" и "какая кодировка символов обнаружена StreamReader?" и в вашем уме, и в вашем вопросе. Ответы должны быть:
File.Copy
не должен изменять содержимое файла вообще
StreamReader
может обнаруживать только UTF-8 и UTF-16; если вам нужно прочитать файл, закодированный в любой другой кодировке, вы должны указать это явно в конструкторе. (Кстати, я бы лично порекомендовал использовать Encoding.Default
вместо Encoding.GetEncoding(0)
. Думаю, это понятнее.)