搜索单词中的多个文件,并将其替换为单击事件上的单个单词

时间:2018-04-28 05:24:30

标签: c#

我需要在文件中搜索"INFO""ERROR""FATAL"等日志文件中的字词,并且需要将其替换为支票上的"DEBUG"字词框单击。如果我取消选中此框,则"DEBUG"中的字词应替换为原始状态,例如"INFO""ERROR" e.t.c。

我尝试使用File.Replace()方法。但它有助于搜索&只替换一个单词。我不知道如何处理它或其他什么。另外,如何保持文件的先前状态。

我使用了以下代码。但在某个地方我犯了一个错误。

private void ToggleforDebugMode(bool IsDebug)
{
    string text = @"C:\Program Files (x86)\Hi.config";
    string filePath = Path.GetDirectoryName("Hi.config") + fileName;
    text = File.ReadAllText(@"C:\Program Files (x86)\Hi.config");
    if (IsDebug)
    {
        _previousState = text.Contains("WARN") ? "WARN" : "INFO";

        if(text.Contains("WARN"))
        {
            text = text.Replace("WARN", "DEBUG");
        }
        else if (text.Contains("DEBUG"))
        {
            text = text.Replace("INFO", "DEBUG");
        }               

    }
    else
    {
         text = text.Replace("DEBUG", _previousState);
    }
    File.WriteAllText(@"C:\Program Files (x86)\Galileo Print Manager .NET\GPM_Service.exe.config", text);
}

2 个答案:

答案 0 :(得分:2)

我不明白为什么这个问题会得到负面投票,这是一个有趣的问题,因为它提出了一个对未来具有相同问题或类似问题的读者有用的概念。

@Priya,我创建了这个方法,用特定的单词取代你指定的所有单词

在此示例中,N替换为"FATAL", "ERROR", "WARN"

"FUNNY"

另外,正如您所看到的,我使用string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Test.txt"; PriyaMethod(path, true, "FUNNY", "FATAL", "ERROR", "WARN"); 来保存文件内容的先前状态,以便在需要恢复时调用。

string

如果你想跳过线:

        using System.IO;

        //Save the original content to restore it when required
        private string SavedState = String.Empty;

        private void PriyaMethod(string FilePath, bool IsDebug, string ReplaceWord, params string[] WordsToReplace)
        {
            //string[] WordsToUse = { "INFO", "ERROR", "FATAL", "DEBUG", "WARN" };

            if (System.IO.File.Exists(FilePath))
            {
                // string[] Lines = System.IO.File.ReadAllLines(FilePath);
                // string[] Words = System.IO.File.ReadAllText(FilePath).Split(' 
                 string Text = System.IO.File.ReadAllText(FilePath);
                // byte[] Bytes = System.IO.File.ReadAllBytes(FilePath);
                // IEnumerable<string> ReadLines = System.IO.File.ReadLines(FilePath);*/

                 SavedState = Text;

                 if (IsDebug)
                 {

                    for (int i = 0; i < WordsToReplace.Length; ++i)
                    {
                        Text = Text.Replace(WordsToReplace[i], ReplaceWord);
                    }

                    //If the file is open, it closes it to prevent an IOException from occurring
                    File.Open(FilePath, FileMode.Open, FileAccess.Write, FileShare.Read).Close();
                    File.WriteAllText(FilePath, Text); //Write new content
                 }
                 else
                 {
                    //If the file is open, it closes it to prevent an IOException from occurring
                    File.Open(FilePath, FileMode.Open, FileAccess.Write, FileShare.Read).Close();
                    File.WriteAllText(FilePath, SavedState); //Restore old content
                 }

            }
            else
            {
                throw new FileNotFoundException(System.String.Format("The file {0} does not exists", FilePath));
            }
        }

或者

string[] Lines = System.IO.File.ReadAllLines(FilePath);

int LinePosition = 0; // First line

Lines[LinePosition] = String.Empty // Delete selected line

装配NewContent:

string Content = System.IO.File.ReadAllText(FilePath);

string[] Lines = Content.Split('\n');

int LinePosition = 1; // Second line

Lines[LinePosition] = null // Delete selected line

答案 1 :(得分:0)

无法评论,所以写一个答案。你的其他陈述是错误的:

else if (text.Contains("DEBUG"))

应该是:

else if (text.Contains("INFO"))

我认为您的文字不包含"WARN""INFO"。如果确实如此,那么previousState就不起作用了。