Замена текста в файле

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

private void changeText(string searchString, string newString, FileInfo[] listOfFiles)
{
    foreach (FileInfo tempfi in listOfFiles)//Foreach File
    {
        string fileToBeEdited = tempfi.FullName;
        File.SetAttributes(fileToBeEdited, File.GetAttributes(fileToBeEdited) & ~FileAttributes.ReadOnly); //Remove ReadOnly Property
        string strFile = System.IO.File.ReadAllText(fileToBeEdited); //Reads In Text File
        if(strFile.Contains(newString))//If the replacement string is contained in the text file
        {
            strFile = strFile.Replace(searchString, newString);
            System.IO.File.WriteAllText(fileToBeEdited, strFile); //Write changes to File
            myTextBox.Text = "File Changed: " + fileTobeEdited.ToString() + Environment.NewLine; //Notify User
        }
    }
}

Если я запускаю это 1 раз или 100 раз, мои текстовые файлы обновляются просто отлично. Если я запускаю это во второй раз, мое текстовое поле повторно обновляется, говоря, что оно обновило новые файлы.

Я ожидаю, что этот метод не найдет текст для замены после первого запуска.

3 ответа

Решение

Переменная fileToBeEdited не был инициализирован.

Вы должны искать файлы, которые содержат searchString не newString!

private void changeText(string searchString, string newString, FileInfo[] listOfFiles)
{
    foreach (FileInfo tempfi in listOfFiles) {
        string fileToBeEdited = tempfi.FullName; // <== This line was missing
        File.SetAttributes(tempfi.FullName, File.GetAttributes(fileToBeEdited) &
                                            ~FileAttributes.ReadOnly);
        string strFile = System.IO.File.ReadAllText(fileToBeEdited);
        if (strFile.Contains(searchString)) { // <== replaced newString by searchString
            strFile = strFile.Replace(searchString, newString);
            System.IO.File.WriteAllText(fileToBeEdited, strFile);
            myTextBox.Text = "File Changed: " + fileToBeEdited.ToString() +
                             Environment.NewLine;
        }
    }
}

Не похоже, что вы на самом деле меняете файл. Вы проверяете, содержится ли строка в файле, а затем, если это так, вы записываете этот файл обратно. Вы должны сделать что-то вроде этого:

    private void changeText(string searchString, string newString, FileInfo[] listOfFiles)
{
    foreach (FileInfo tempfi in listOfFiles)//Foreach File
    {
        File.SetAttributes(fileToBeEdited, File.GetAttributes(fileToBeEdited) & ~FileAttributes.ReadOnly); //Remove ReadOnly Property
        string strFile = System.IO.File.ReadAllText(fileToBeEdited); //Reads In Text File
        if(strFile.Contains(newString))//If the replacement string is contained in the text file
        {
            strFile = strFile.Replace(searchString,newString); // make the changes
            System.IO.File.WriteAllText(fileToBeEdited, strFile); //Write changes to File
            myTextBox.Text = "File Changed: " + fileTobeEdited.ToString() + Environment.NewLine; //Notify User
        }
    }
}

После этого вы сможете сохранить изменения в файле, и после первого запуска новый файл будет записан.

Может быть, я неправильно читаю код, но вы, кажется, пропускаете замену!

    string strFile = System.IO.File.ReadAllText(fileToBeEdited); //Reads In Text File
    if(strFile.Contains(searchString))//If the replacement string is contained in the text file
    {
        strFile = strFile.Replace(searchString, newString);
 ....

Также обратите внимание, как я проверяю, содержит ли файл строку поиска, а не новую строку.

Другие вопросы по тегам