StreamReader не работает должным образом - PullRequest
0 голосов
/ 11 января 2011

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

Например, файл может выглядеть так:

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

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

Ответы [ 5 ]

2 голосов
/ 11 января 2011

Это проблема кодирования.

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

using (StreamWriter writer = new StreamWriter(filePath))

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

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

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

myEncoding = reader.CurrentEncoding;
1 голос
/ 11 января 2011

Получите кодировку из читателя и используйте ее в писателе.

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

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;
}
1 голос
/ 11 января 2011

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

StreamWriter(string path, bool append, Encoding encoding)

т.е.

new StreamWriter(filePath, false, new UTF8Encoding())
0 голосов
/ 11 января 2011

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

0 голосов
/ 11 января 2011

Вы должны указать кодировку

System.Text.Encoding.UTF8, чтобы сделать трюк.я отсортировал это пожалуйста, пообещай мне прочитать это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...