Замена текста в файле
Я написал метод, который будет проходить через все текстовые файлы, заменять текст и обновлять текстовое поле с указанными изменениями. Он работает после того, как я запускаю его в первый раз, но последующие исполнения, похоже, показывают, что файлы не были изменены в первый раз.
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);
....
Также обратите внимание, как я проверяю, содержит ли файл строку поиска, а не новую строку.