从CSV文件读取ping网站

时间:2018-03-13 05:01:16

标签: c# csv ping

是的,这是来自家庭作业,但即使是我的教授也不知道为什么它不起作用,所以我来到这里。我们的想法是从一个CSV文件中读取,ping其中的所有URL,并将结果数据放入第二个CSV文件中。问题是代码会循环回到CSV文件中的第一个URL,并在通过第一个URL后开始返回错误消息。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.IO;
using Microsoft.VisualBasic.FileIO;
using System.Xml.Linq;
using System.Net.NetworkInformation;


namespace Project04
{
class Program
{
    static void Main(string[] args)
    {
        string choice;
        //menu
        do
        {

            Console.WriteLine("Select an option:");
            Console.WriteLine("A) Start Ping");
            Console.WriteLine("B) Stop Ping");
            Console.WriteLine("C) Exit");
            choice = Console.ReadLine();

            switch (choice)
            {
                case "A":
                    RunPing();
                    break;

                case "B":
                    //stop method
                    //needed?
                    break;

                default:
                    break;

            }
            Console.Clear();


        } while (choice != "C");

    }
    public static void RunPing()
    {
        //timer
        System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Interval = 5000;
        aTimer.Enabled = true;

        Console.WriteLine("Press 'B' to stop.");
        while (Console.Read() != 'B');

    }
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        //csv reader
        using (TextFieldParser parser = new TextFieldParser("Project04_URLs.csv"))
        {
            parser.TextFieldType = FieldType.Delimited;
            parser.SetDelimiters(",");
            while (!parser.EndOfData)
            {

                string[] fields = parser.ReadFields();
                foreach (string URL in fields)
                {
                    try
                    {
                        //ping
                        Ping myPing = new Ping();
                        PingReply reply = myPing.Send(URL, 5000);
                        if (reply != null)
                        {
                            //write ping to other csv
                            StreamWriter writer = new StreamWriter("Ping_Data.csv");
                            writer.WriteLine("Status :  " + reply.Status + " \n Time : " + reply.RoundtripTime.ToString() + " \n Address : " + reply.Address);
                        }
                    }
                    catch
                    {
                        Console.WriteLine("ERROR: You have Some TIMEOUT issue");
                    }
                    Console.ReadKey();
                    Console.Clear();
                }

            }
        }
    }
  }
}

初始CSV文件(Project04_URLs)包含这些网址。

na02.mypinpointe.com
na03.mypinpointe.com
na04.mypinpointe.com
na05.mypinpointe.com
na06.mypinpointe.com
na07.mypinpointe.com
na08.mypinpointe.com

na09.mypinpointe.com
na10.mypinpointe.com
na11.mypinpointe.com

第二个CSV文件(Ping_Data)为空。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

您的代码的一些观察结果:

  1. 您的计时器每隔5秒触发一次 - 这意味着您的代码每隔5秒就会尝试ping CSV文件中的每个网址。

  2. 在For循环结束时有一个Console.ReadKey() - 它将在每次迭代中停止执行并等待用户输入。

  3. 在for循环中 - 你有一个无关的StreamWriter打开并一直写入同一个文件(文件名是硬编码) - 这意味着(连同#1)你可能有文件访问问题 - 其中不止一个thread(timer fire)正在同一个磁盘文件上运行。此外,输入csv文件也被多次打开。

  4. 建议:

    1. 使用TextFieldParser - 在短范围内。也许只是提取字符串数组中的url并处理TextFieldParser

    2. 在for循环中ping每个url后,你真的需要Console.ReadKey()吗?如果您离开计算机20分钟,则有许多线程在等待控制台输入。在控制台上按下B后,使用线程同步技术(例如:ManualResetEvent)设计定时器线程退出。或者您也可以使用从MAIN()方法设置的"廉价hack" bool变量,并每次检查Timer fire方法中的bool变量,如果设置则返回。

    3. 为输出csv文件创建动态名称,并在其中写入Ping结果。像

      这样的东西

      var wrtr = new StreamWriter(string.Format(" Ping_Data_ {0} _ {1} .csv",URL,DateTime.Now.ToString(" ddMMyyyy-HHmmss") ));

    4. 这就是我的代码(仍然不知道你为什么需要一个Timer)。请注意,bool _Terminate是一个可耻的退出标志 - 意味着每个计时器线程将尽快退出。另一种策略是删除bool标志本身(即仅禁用定时器)。在这种情况下,每个线程一完成所有工作量就会退出(即CSV中的所有URL都被ping了)。

      completed