У меня есть программное обеспечение, которое при установке запрашивает IP-адрес моего сервера и сохраняет этот адрес в нескольких файлах конфигурации в разных папках. Этот код, который у меня есть, обновляет адрес конечной точки файла конфигурации внутри одного файла конфигурации.

Как бы я изменил код, чтобы посмотреть, где было установлено программное обеспечение, и обновить все IP-адреса во ВСЕХ файлах конфигурации в разных папках, где было установлено программное обеспечение.

Все файлы конфигурации с IP-адресами выглядят примерно так же, как в моем примере.

ConfigFile

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;


namespace ConfigTool
{
    class Class1
    {
    //    foreach (Environment.SpecialFolder folder_type in Enum.GetValues(typeof(Environment.SpecialFolder)))
    //    {
    //        DescribeFolder(folder_type);
    //    }
    //txtFolders.Select(0, 0);
    //const string FILENAME = Environment.GetFolderPath(Environment.SpecialFolder.);
        const string FILENAME = @"C:\Program Files (x86)\******\***\***\*****\*****.****.****.exe.config";
        public static IPAddress GetIPAddress(string hostName)
        {
            Ping ping = new Ping();
            var replay = ping.Send(hostName);

            if (replay.Status == IPStatus.Success)
            {
                return replay.Address;
            }
            return null;
        }

        static void Main(string[] args)
        {
            XDocument doc =  XDocument.Load(FILENAME);
                List<XElement> endpoints = doc.Descendants("endpoint").ToList();
                foreach (var endpoint in endpoints )
                {
                    string address = (string)endpoint.Attribute("address");
                    string newIp = "10.249.30.4";

                    string pattern = "//[^:]+";
                    address = Regex.Replace(address, pattern, "//" + newIp);

                    endpoint.Attribute("address").SetValue(address);
                }
            doc.Save(

Пример XML

<endpoint name="***Local" address="net.tcp://10.249.30.4:7732/EventSubscriberServices/Secure" binding="netTcpBinding" contract="****.Services.ServiceContracts.ISubscriptionService" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="CustomValidator">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint name="***Local" address="net.tcp://10.243.32.4:7732/EventPublishServices/Secure" binding="netTcpBinding" contract="****.Services.ServiceContracts.IPublishService" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="CustomValidator">
        <identity>
          <dns value="*******" />
        </identity>
      </endpoint>
      <endpoint name="****" address="net.tcp://10.243.32.4:7732/AuthenticationServices/Secure" binding="netTcpBinding" contract="****.Services.ServiceContracts.IAuthenticationService" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="CustomValidator">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
0
Masterolu 15 Дек 2019 в 03:07
Так какой у вас конкретный вопрос? С какой частью этого у вас возникают трудности?
 – 
Ken White
15 Дек 2019 в 03:19
«Как мне изменить код, чтобы посмотреть, где было установлено программное обеспечение, и обновить все IP-адреса во ВСЕХ файлах конфигурации в РАЗНЫХ папках, где было установлено программное обеспечение».
 – 
Masterolu
15 Дек 2019 в 06:34
Этот вопрос слишком широк. Ваш вопрос о поиске файлов или обновлении XML? Опять же, какой у вас конкретный вопрос? Разбейте то, что вы хотите сделать, на задачи и начните работать над одной из них. Первым может быть поиск файлов. Заставьте это работать. Затем начните работать над их обновлением. Когда у вас есть код, написанный для этой первой задачи, и вы сталкиваетесь с трудностями, вы можете обратиться за помощью с этим конкретным кодом.
 – 
Ken White
15 Дек 2019 в 06:43
Код, который я закомментировал, — это код, написанный для задачи. Я пытался создать Environment.SpecialFolder, чтобы увидеть, где было установлено программное обеспечение, и выполнить конфигурации xml внутри этого каталога, но я не знаком с методом Environment.Special. Я надеялся, что кто-то может указать мне правильное направление
 – 
Masterolu
15 Дек 2019 в 07:07
Код, который вы закомментировали, не является вопросом. Если ваш вопрос касается использования функции Environment.SpecialFolder, отредактируйте его, чтобы задать вопрос по этой теме. Вам нужно задать конкретный вопрос в самом посте, если вам нужна помощь здесь. Я дважды просил вас сделать это, и вы до сих пор не внесли редактирование в свой пост, чтобы уточнить о чем вы конкретно спрашиваете. (Кроме того, вы не можете просто продолжать вводить подстановочные знаки * и надеяться, что это что-то сделает, потому что это не так. Подстановочный знак пути к файлу должен быть допустимым.)
 – 
Ken White
15 Дек 2019 в 07:12

1 ответ

Использование Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<EndPoint> endPoints = doc.Descendants("endpoint").Select(x => new EndPoint()
            {
                name = (string)x.Attribute("name"),
                address = (string)x.Attribute("address"),
                binding = (string)x.Attribute("binding"),
                contract = (string)x.Attribute("contract"),
                bindingConfiguration = (string)x.Attribute("bindingConfiguration"),
                behaviorConfiguration = (string)x.Attribute("behaviorConfiguration"),
                dns = (string)x.Descendants("dns").FirstOrDefault().Attribute("value"),

            }).ToList();
        }
    }
    public class EndPoint
    {
        public string name { get; set; }
        public string address { get; set; }
        public string binding { get; set; }
        public string contract { get; set; }
        public string bindingConfiguration { get; set; }
        public string behaviorConfiguration { get; set; }
        public string dns { get; set; }
    }
}
-1
jdweng 15 Дек 2019 в 08:01