StreamReader не работи според очакванията

Написах проста помощна програма, която преминава през всички 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;
}

Всяка помощ/предложения се оценяват. Благодаря!


person Community    schedule 11.01.2011    source източник
comment
Не се притеснявайте, току-що редактирах отстъпите ви, за да стане по-ясно. Защо не? Възразявате ли?   -  person abatishchev    schedule 11.01.2011
comment
съжалявам, че не ми харесва, когато хората редактират публикациите ми.   -  person    schedule 11.01.2011
comment
Това е основен принцип на SO, така че ако ще публикувате тук, по-добре свикнете с него ;) Прочетете ЧЗВ за информация относно това, ако имате въпроси.   -  person Øyvind Bråthen    schedule 11.01.2011
comment
моля, прочетете това.   -  person abatishchev    schedule 11.01.2011


Отговори (5)


Това е проблем с кодирането.

Мисля, че трябва да промените тази линия

using (StreamWriter writer = new StreamWriter(filePath))

Към вариант, който записва с правилното кодиране (претоварването, което изглежда така)

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

За да получите правилното кодиране, където сте отворили файла, добавете този ред

myEncoding = reader.CurrentEncoding;
person Øyvind Bråthen    schedule 11.01.2011
comment
Няма конструктор, който да приема само String и Encoding, нали? - person abatishchev; 11.01.2011
comment
Добре, той е забравил да включи параметъра за добавяне. И какво?.. Не съм съгласен -1 с теб @abatishchev . Øyvind Bråthen каза каква е грешката. - person HABJAN; 11.01.2011
comment
Моя грешка. Поправихме примера сега. Логиката трябва да работи добре, с изключение на смесването на конструкторите Stream/string. - person Øyvind Bråthen; 11.01.2011
comment
ХАБДЖАН: Мисля, че това е доста грубо отрицание за печатна грешка, но това е негов избор... - person Øyvind Bråthen; 11.01.2011
comment
Веднага щом поправите отговора си, ще се радвам да гласувам за него ;) Когато е грешен - бях недоволен, гласувайте против него ;) - person abatishchev; 11.01.2011
comment
Наистина обичам да гласувам за правилните отговори :) Гласуването против разбира се е разстройващ, но ефективен начин да посочите грешка. Няма значение, наистина. - person abatishchev; 11.01.2011

Опитайте се да използвате

StreamWriter(string path, bool append, Encoding encoding)

i.e.

new StreamWriter(filePath, false, new UTF8Encoding())
person abatishchev    schedule 11.01.2011

Вземете кодирането от reader и го използвайте в writer.

Променен код:

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;
}
person HABJAN    schedule 11.01.2011

Трябва да посочите кодирането

System.Text.Encoding.UTF8 трябва да свърши работа.

След като го сортирате, моля, обещайте ми да прочета това.

person m.edmondson    schedule 11.01.2011
comment
Този конструктор приема (Stream, Encoding), но OP използва String - person abatishchev; 11.01.2011
comment
Не разбирам какво казваш - person m.edmondson; 11.01.2011
comment
OP не използвайте конструктора, за който говорите, защото той приема поток като параметър, докато OP използва файлов път - person abatishchev; 11.01.2011
comment
@abatishchev - Строго към гласуването против днес? - person Øyvind Bråthen; 11.01.2011
comment
Повече удебелен текст прави ли отговора ви по-ясен? Или да, така! - person abatishchev; 11.01.2011
comment
Вярвам, че го прави - той уточнява отговора кратко с удебелен шрифт, след което продължава с по-подробности. Имате ли лош ден @abatishchev? - person m.edmondson; 11.01.2011
comment
Не, нямам. Не виждам причина да удебелявам ред в отговора, когато има само 3 реда. Достатъчно ясно е. Добре, твоето право е да подчертаеш всичко, което искаш :) Просто редактирай публикацията си, за да сочи към друг, правилния конструктор и аз ще гласувам за него, дотогава съм сигурен, че отговорът ти е неправилен и трябва да бъде гласуван против - person abatishchev; 11.01.2011

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

person ndtreviv    schedule 11.01.2011
comment
Е, благодаря за кучкия шамар с отрицателен вот. Съответно редактиран. - person ndtreviv; 12.01.2011