将文件复制到远程服务器检查

时间:2016-12-16 17:21:16

标签: c# winforms

我有大约100个远程服务器,下面我试图复制一些文件 从我的电脑到所有这些远程服务器,但我想做一些检查

1-检查是否可以连接到远程服务器,如果没有,则转到下一个办公室

2 - 用于用户互动

a-我试图在datagridview1为选定的行着色,让用户知道现在的进度和datagridview2同样的事情,让用户知道进度是哪个文件现在在特定的办公室,但开始发送文件后界面冻结,没有交互发生怎么办?

b-如果成功,如何将成品办公室排成绿色?

更新

我使用线程来解决表单冻结,因此反馈将返回给用户 但问题没有解决,仍然发生,没有任何改变,请我该怎么做???

public void PatchUpdates()
{
    try
    {
        foreach (DataGridViewRow OfficeListRow in DGV_OfficeList.Rows)
        {
            string OfficeIPAddress = OfficeListRow.Cells[2].Value.ToString();

            foreach (DataGridViewRow FileListRow in DGV_FileList.Rows)
            {
                string SoruceFileNamePath = FileListRow.Cells[4].Value.ToString();
                string DestinationFileNamePath = @"\\" + OfficeIPAddress + @"\usb1_1\test\" + Path.GetFileName(SoruceFileNamePath);


                Thread foregroundthread = new Thread(() => CheckOffice(OfficeIPAddress));

                foregroundthread.Start();

                //check if connection to remote server is available
                if (CheckOffice(OfficeIPAddress) == 1)
                {
                    DGV_OfficeList[3, DGV_OfficeList.CurrentCell.RowIndex].Value = "Connected";
                    //file.copy(sorucefilenamepath, destinationfilenamepath, true); //copy files...
                }
                else if (CheckOffice(OfficeIPAddress) == 0)
                {
                    DGV_OfficeList[3, DGV_OfficeList.CurrentCell.RowIndex].Value = "disconnected";
                    break;
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

检查连接方法

public int CheckOffice(string _ipAddress)
{
    int timeout = 120;
    string data = "PingTestData";
    byte[] buffer = Encoding.ASCII.GetBytes(data);

    Ping PingSender = new Ping();
    PingOptions options = new PingOptions();

    options.DontFragment = true;

    PingReply reply = PingSender.Send(_ipAddress, timeout, buffer, options);

    if (reply.Status == IPStatus.Success)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

enter image description here

2 个答案:

答案 0 :(得分:0)

这是很多问题,我认为将它们放在一个帖子中并不是一个好主意。但是我可以回答其中的一部分: 1-我认为你的网络检查不起作用。方法" GetIsNetworkAvailable"仅检查您的计算机是否已连接到网络。你需要了解" ping"或类似的东西(MSDN Ping class)。顺便说一句。如果您使用" return"在检测到网络故障后,您将离开该方法。使用" break"而只是留下内循环。

2-如链接File.Copy中所述,成功或抛出异常。所以描述的方式应该没问题。

3-显示使用后台工作线程(BackgroundWorker)所需的进度。

答案 1 :(得分:0)

我猜是从GUI线程调用PatchUpdates。如果更新复制文件的循环中的DataGridViewRow.Selected,那么GUI将永远不会反映出该更改,因为您的函数尚未返回。有几种方法可以解决它。

  1. (Hackiest,但最快)在Application.DoEvents()更改后致电DataGridViewRow.Selected
  2. (更清洁的解决方案,但更多的努力)在后台线程中执行此处理并切换到GUI线程以使用Control.BeginInvoke()方法更新GUI。
  3. 除此之外,您的代码中存在许多问题:

    以下行不会更改,但会在循环中调用以不断检查您的网络连接是否已断开。它可能是你真正需要的东西,但它有点突出是一个错误。也许您想使用Ping类来检查机器是否可用?

    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    

    你刚刚无缘无故地切换了这个值。也许你只是想尝试调试你的解决方案。或者也许你真的希望线条闪现,但这个代码不会发生

    OfficeListRow.Selected = true;
    OfficeListRow.Selected = false;