Ping C#: параллельное выполнение

Messages
1,679
Reaction score
288
Website
tehadm.ru
C#:
// Подключаем пространства имён
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net.NetworkInformation;
 
namespace PingSystemAndCheckAdminShare
{
    class Program
    {
        // данная коллекция будет содержать имена рабочих станций
        private static List<string> hosts = new List<string>();
 
        public static void Main()
        {
            // В переменную hosts записываем все рабочие станции из файла
            hosts = getComputersListFromTxtFile("D:\\computersList.txt");
            // Создаём Action типизированный string, данный Action будет запускать функцию Pinger
            Action<string> asyn = new Action<string>(Pinger);
            // Для каждой рабочей станции запускаем Pinger'а
            hosts.ForEach(e =>
            {
                asyn.Invoke(e);
            });
            Console.ReadKey();
 
        }
        
        // Функция получения списка рабочих станций из файла
        private static List<string> getComputersListFromTxtFile(string pathToFile)
        {
            List<string> computersList = new List<string>();
            using (StreamReader sr = new StreamReader(pathToFile, Encoding.Default))
            {
                string line = "";
                while ((line = sr.ReadLine()) != null)
                {
                    computersList.Add(line);
                }
            }
            return computersList;
        }
        
        // Функция записи проблемных рабочих станций в файл
        private static void writeProblemComputersToFile(string fullPathToFile, List<string> problemComputersList)
        {
            using (StreamWriter sw = new StreamWriter(fullPathToFile, true, Encoding.Default))
            {
                problemComputersList.ForEach(e => {sw.WriteLine(e);});   
            }
        }
        
        // Проверяем доступна ли папка admin$
        private static bool checkAdminShare(string computerName)
        {
            if (Directory.Exists("\\\\" + computerName + "\\admin$"))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        // Наш основной класс, который будет отправлять команду ping
        async private static void Pinger(string hostAdress)
        {
            // Создаём экземпляр класса Ping
            Ping png = new Ping();
            try
            {
                // Пингуем рабочую станцию hostAdress
                PingReply pr = await png.SendPingAsync(hostAdress);
                List<string> problemComputersList = new List<string>();
                Console.WriteLine(string.Format("Status for {0} = {1}, ip-адрес: {2}", hostAdress, pr.Status, pr.Address));
                // Если рабочая станция пингуется и папка admin$ недоступна,
                // то такую машину заносим в список
                if (pr.Status == IPStatus.Success && !checkAdminShare(hostAdress))
                {
                    problemComputersList.Add(hostAdress);
                }
                // Записываем в файл все проблемные машины
                writeProblemComputersToFile("D:\\problemsWithAdminShare.txt", problemComputersList);
            }
            catch
            {
                Console.WriteLine("Возникла ошибка! " + hostAdress);
            }
        }
    }
}
 
Back
Top