簡體   English   中英

在 C# 中打開文件並替換字符串

[英]Open a file and replace strings in C#

我試圖找出打開現有文件的最佳方法,並將與聲明的字符串匹配的所有字符串替換為新字符串,保存然后關閉。

建議?

可以在一行中完成:

File.WriteAllText("Path", Regex.Replace(File.ReadAllText("Path"), "[Pattern]", "Replacement"));

如果您正在讀取大文件,並且您的替換字符串可能不會出現在多行中,我建議您使用以下內容...

private static void ReplaceTextInFile(string originalFile, string outputFile, string searchTerm, string replaceTerm)
{
    string tempLineValue;
    using (FileStream inputStream = File.OpenRead(originalFile) )
    {
        using (StreamReader inputReader = new StreamReader(inputStream))
        {
            using (StreamWriter outputWriter = File.AppendText(outputFile))
            {
                while(null != (tempLineValue = inputReader.ReadLine()))
                {
                    outputWriter.WriteLine(tempLineValue.Replace(searchTerm,replaceTerm));
                }
            }
        }
    }
}

然后您必須刪除原始文件,並將新文件重命名為原始名稱,但這很簡單 - 就像在方法中添加一些基本錯誤檢查一樣。

當然,如果您的替換文本可能跨越兩行或更多行,則您需要做更多的工作,但我會將其留給您自己解決。 :)

using System;
using System.IO;
using System.Text.RegularExpressions;

public static void ReplaceInFile(
                      string filePath, string searchText, string replaceText )
{

    var content = string.Empty;
    using (StreamReader reader = new StreamReader( filePath ))
    {
        content = reader.ReadToEnd();
        reader.Close();
    }

    content = Regex.Replace( content, searchText, replaceText );

    using (StreamWriter writer = new StreamWriter( filePath ))
    {
        writer.Write( content );
        writer.Close();
    }
}

對不需要正則表達式且滿足問題要求的已接受答案略有改進:

File.WriteAllText("Path", File.ReadAllText("Path").Replace("SearchString", "Replacement"));
public partial class ReadAndChange : System.Web.UI.Page
{
    ArrayList FolderList = new ArrayList();
    ArrayList FolderListSearch = new ArrayList();
    ArrayList FileList = new ArrayList();
    protected void Page_Load(object sender, EventArgs e)
    {
        AllFolderList("D:\\BinodBackup\\Nilesh\\14.5.2013\\Source");
        foreach (string Path in FolderList)
        {
            AllFileList(Path);
        }
        foreach (string Path in FileList)
        {
            ReplaceFile(Path, Path.Replace("Source", "EditedCode"));
        }

        //string SourcePath = "D:\\BinodBackup\\Nilesh\\14.5.2013\\Onesource\\Onesource\\UserManagement\\UserControls\\AddUserDetails.ascx.cs";
        //string ReplacePath = "D:\\AddUserDetails.ascx.cs";
        //ReplaceFile(SourcePath, ReplacePath);
    }

    private static void ReplaceFile(string SourcePath, string ReplacePath)
    {
        int counter = 1;
        string line;

        // Read the file and display it line by line.
        System.IO.StreamReader file = new System.IO.StreamReader(SourcePath);
        while ((line = file.ReadLine()) != null)
        {
            if (!(line.Contains("//")))
            {
                if (line.Contains(".LogException("))
                {
                    //Console.WriteLine(counter.ToString() + ": " + line);
                    string[] arr = line.Split(',');
                    string stringToReplace = arr[0].Replace("LogException", "Publish") + " , " + arr[2].Trim() + " , " + arr[3].Replace(");", "").Trim() + " , " + arr[1].Trim() + ");";
                    //File.WriteAllText(currentPath, Regex.Replace(File.ReadAllText(currentPath), line, line + " Added"));
                    File.WriteAllText(ReplacePath, File.ReadAllText(ReplacePath).Replace(line, stringToReplace));
                    //ReplaceInFile(currentPath, line, stringToReplace);
                }
            }

            counter++;
        }

        file.Close();
    }
    private void AllFileList(string FolderPath)
    {
        DirectoryInfo dir = new DirectoryInfo(FolderPath);
        DirectoryInfo[] subdir = dir.GetDirectories();
        if (subdir.Length > 0)
        {

            foreach (DirectoryInfo dr in subdir)
            {
                FileInfo[] files1 = dr.GetFiles();
                foreach (FileInfo file in files1)
                {
                    if(file.Name.EndsWith(".cs"))
                    CheckAndAdd((file.DirectoryName + "\\" + file.Name), FileList);
                }

            }
        }
    }

    private void AllFolderList(string FolderPath)
    {
        string CurFolderPatgh = FolderPath;
        Again:
        AddToArrayList(CurFolderPatgh);
        DirectoryInfo dir = new DirectoryInfo(CurFolderPatgh);
        DirectoryInfo[] subdir = dir.GetDirectories();

        if (subdir.Length > 0)
        {
            foreach (DirectoryInfo dr in subdir)
            {
                AddToArrayList(((System.IO.FileSystemInfo)(dir)).FullName + "\\" + dr.Name);
            }
        }
        if (FolderListSearch.Count > 0)
        {
            foreach (string dr in FolderListSearch)
            {
                CurFolderPatgh = dr;
                FolderListSearch.Remove(dr);
                goto Again;
            }
        }
    }

    private void AddToArrayList(string FolderPath)
    {
        if (!(FolderList.Contains(FolderPath)))
        {
            CheckAndAdd(FolderPath, FolderList);
            CheckAndAdd(FolderPath, FolderListSearch);
        }
    }

    private void CheckAndAdd(string FolderPath,ArrayList ar)
    {
        if (!(ar.Contains(FolderPath)))
        {
            ar.Add(FolderPath);
        }
    }

    public static void ReplaceInFile(
                      string filePath, string searchText, string replaceText)
    {

        var content = string.Empty;
        using (StreamReader reader = new StreamReader(filePath))
        {
            content = reader.ReadToEnd();
            reader.Close();
        }

        content = content.Replace(searchText, replaceText);

        using (StreamWriter writer = new StreamWriter(filePath))
        {
            writer.Write(content);
            writer.Close();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;

namespace DevExpressFileEditing
{
    class Program
    {
        static List<FileInfo> _files;
        private static Dictionary<string, string> _replaceList;

        static void Main()
        {
            _files = new List<FileInfo>();
            _replaceList = new Dictionary<string, string>();

            Console.WriteLine("Dark directory searching");
            SearchFilesInDirectories(new DirectoryInfo(@"C:\Sourcebank\Dark"));

            Console.WriteLine("Light directory searching");
            SearchFilesInDirectories(new DirectoryInfo(@"C:\Sourcebank\Light"));

            Console.WriteLine("{0} files found", _files.Count.ToString(CultureInfo.InvariantCulture));

            Console.WriteLine("Replace dictinary creating");
            CreateReplaceList();
            Console.WriteLine("{0} item added", _replaceList.Count.ToString(CultureInfo.InvariantCulture));

            Console.Write("Replacement doing");
            for (int i = 0; i < _files.Count; i++)
            {
                var fileInfo = _files[i];
                Console.CursorLeft = 0;
                Console.Write("{0} of {1}", i.ToString(CultureInfo.InvariantCulture), _files.Count.ToString(CultureInfo.InvariantCulture));
                ReplaceInFile(fileInfo.FullName);
            }
            Console.CursorLeft = 0;
            Console.Write("Replacement done");
        }

        private static void SearchFilesInDirectories(DirectoryInfo dir)
        {
            if (!dir.Exists) return;

            foreach (DirectoryInfo subDirInfo in dir.GetDirectories())
                SearchFilesInDirectories(subDirInfo);

            foreach (var fileInfo in dir.GetFiles())
                _files.Add(fileInfo);
        }

        private static void CreateReplaceList()
        {
            _replaceList.Add("Color=\"#FFF78A09\"", "Color=\"{DynamicResource AccentColor}\"");
            _replaceList.Add("Color=\"{StaticResource ColorHot}\"", "Color=\"{DynamicResource AccentColor}\"");
            _replaceList.Add("Color=\"#FFCC0000\"", "Color=\"{DynamicResource AccentColor}\"");
            _replaceList.Add("To=\"#FFCC0000\"", "To=\"{DynamicResource AccentColor}\"");
            _replaceList.Add("To=\"#FFF78A09\"", "To=\"{DynamicResource AccentColor}\"");
            _replaceList.Add("Background=\"#FFF78A09\"", "Background=\"{DynamicResource Accent}\"");
            _replaceList.Add("Foreground=\"#FFF78A09\"", "Foreground=\"{DynamicResource Accent}\"");
            _replaceList.Add("BorderBrush=\"#FFF78A09\"", "BorderBrush=\"{DynamicResource Accent}\"");
            _replaceList.Add("Value=\"#FFF78A09\"", "Value=\"{DynamicResource Accent}\"");
            _replaceList.Add("Fill=\"#FFF78A09\"", "Fill=\"{DynamicResource Accent}\"");
        }

        public static void ReplaceInFile(string filePath)
        {
            string content;
            using (var reader = new StreamReader(filePath))
            {
                content = reader.ReadToEnd();
                reader.Close();
            }

            content = _replaceList.Aggregate(content, (current, item) => current.Replace(item.Key, item.Value));

            using (var writer = new StreamWriter(filePath))
            {
                writer.Write(content);
                writer.Close();
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM