2011-01-11 3 views
0

Я написал простую утилиту, которая просматривает все файлы C# в моем проекте и обновляет текст авторского права вверху.StreamReader не работает как ожидалось

Например, файл может выглядеть следующим образом:

//Copyright My Company, © 2009-2010 

Программа должна обновить текст, чтобы он выглядел следующим образом;

//Copyright My Company, © 2009-2010 

Однако код, который я написал, приводит к этому;

//Copyright My Company, � 2009-2011 

Вот код, который я использую;

public bool ModifyFile(string filePath, List<string> targetText, string replacementText) 
{ 
    if (!File.Exists(filePath)) return false; 
    if (targetText == null || targetText.Count == 0) return false; 
    if (string.IsNullOrEmpty(replacementText)) return false; 

    string modifiedFileContent = string.Empty; 
    bool hasContentChanged = false; 

    //Read in the file content 
    using (StreamReader reader = File.OpenText(filePath)) 
    { 
     string file = reader.ReadToEnd(); 

     //Replace any target text with the replacement text 
     foreach (string text in targetText) 
      modifiedFileContent = file.Replace(text, replacementText); 

     if (!file.Equals(modifiedFileContent)) 
      hasContentChanged = true; 
    } 

    //If we haven't modified the file, dont bother saving it 
    if (!hasContentChanged) return false; 

    //Write the modifications back to the file 
    using (StreamWriter writer = new StreamWriter(filePath)) 
    { 
     writer.Write(modifiedFileContent); 
    } 

    return true; 
} 

Любая помощь/предложения приветствуются. Благодаря!

+1

Не волнуйся, я только что отредактировали вы отступы, чтобы сделать его более ясным. Почему нет? Вы возражаете? – abatishchev

+0

Извините, мне не нравится, когда люди редактируют мои сообщения. –

+0

Это основополагающий принцип для SO, поэтому, если вы собираетесь публиковать здесь, вам лучше привыкнуть к этому;) Прочитайте FAQ для получения информации об этом, если у вас есть вопросы. –

ответ

2

Это проблема с encoing.

Я думаю, вы должны изменить эту строку

using (StreamWriter writer = new StreamWriter(filePath)) 

Для варианта, который сохраняет с правильной кодировкой (перегрузка, которая выглядит следующим образом)

using (StreamWriter writer = new StreamWriter(filePath, false, myEncoding)) 

Чтобы получить правильную кодировку, где вы открыли файл добавить эту строку

myEncoding = reader.CurrentEncoding; 
+0

Нет конструктора, принимающего только 'String' и' Encoding', не так ли? – abatishchev

+0

Хорошо, он забыл включить параметр «добавить». Так что? .. Я не согласен -1 с тобой @abatishchev. Øyvind Bråthen сказал, что это за ошибка. – HABJAN

+0

Мой плохой. Исправлен пример. Логика должна работать хорошо, за исключением смешивания конструкторов Stream/string. –

-1

Вы должны указать encoding

System.Text.Encoding.UTF8 должен сделать трюк.

После того, как вы его отсортировали please promise me to read this.

+0

Этот конструктор принимает '(Stream, Encoding)', но OP использует 'String' – abatishchev

+0

Я не понимаю, что вы говорите –

+0

OP не использует конструктор, о котором вы говорите, потому что он принимает поток как параметр, в то время как OP использует путь к файлу – abatishchev

-1

Держу пари, это связано с кодировкой содержимого файла. Убедитесь, что вы создали экземпляр StreamWriter с правильной кодировкой. (http://msdn.microsoft.com/en-us/library/f5f5x7kt.aspx)

+0

Вы указываете неправильный конструктор – abatishchev

+0

Ну, спасибо за проклятую суку. Отредактировано соответственно. – ndtreviv

1

Попробуйте использовать

StreamWriter(string path, bool append, Encoding encoding) 

т.е.

new StreamWriter(filePath, false, new UTF8Encoding()) 
1

Получить Кодирование от читателя и использовать его в записи.

Измененный код:

public bool ModifyFile(string filePath, List targetText, string replacementText) 
{ 
    if (!File.Exists(filePath)) return false; 
    if (targetText == null || targetText.Count == 0) return false; 
    if (string.IsNullOrEmpty(replacementText)) return false; 

    string modifiedFileContent = string.Empty; 
    bool hasContentChanged = false; 
    Encoding sourceEndocing = null; 

    using (StreamReader reader = File.OpenText(filePath)) 
    { 
     sourceEndocing = reader.CurrentEncoding; 
     string file = reader.ReadToEnd(); 

     foreach (string text in targetText) 
      modifiedFileContent = file.Replace(text, replacementText); 

     if (!file.Equals(modifiedFileContent)) 
      hasContentChanged = true; 
    } 

    if (!hasContentChanged) return false; 

    using (StreamWriter writer = new StreamWriter(filePath, false, sourceEndocing)) 
    { 
     writer.Write(modifiedFileContent); 
    } 

    return true; 
} 
Смежные вопросы