03
4月
2020

C#定时上传文件至FTP服务器

FTP是文件传输协议,允许用户以文件操作的方式(如文件的增、删、改、查和传送等)与另一主机相互通信,在工厂中时常需要将车间设备的信息传送到服务器,在这时FTP就扮演着重要的角色。今天我将通过一个实例向大家演示如何使用C#进行FTP的基本操作和定时上传指定文件。

首先,你需要在本地计算机中搭建FTP服务器并添加FTP用户,网上有很多相关的教程我不再赘述,大家可以参考一下《Windows下IIS搭建Ftp服务器》,这篇文章讲解的很详细。

这里向大家推荐FluentFTP,这是一款完全用C#编写的插件,底层通过Socket实现,提供了广泛的FTP指令使用很流畅基本没有遇到什么坑。获取方式可以从github上下载然后添加到项目中,也可以通过nuget直接安装到项目中,我更喜欢用nuget!

新建一个Windows窗体应用,在”工具”-“NuGet包管理器”中打开”程序包管理器控制台”,输入NuGet命令进行安装。

guide1

图1-NuGet安装命令

安装成功后,项目中就自动添加了FluentFTP引用,使用时需要进行引用声明。

guide2

图2-FluentFTP引用

1.建立FTP连接

/// <summary>
        /// 连接FTP的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click(object sender, EventArgs e)
        {
            FtpClient client = new FtpClient(textBox1.Text);
            client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
            client.Connect();
        }

2.断开FTP连接

/// <summary>
/// 断开FTP的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button2_Click(object sender, EventArgs e)
{
    FtpClient client = new FtpClient(textBox1.Text);
    client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
    client.Disconnect();
}

3.上传文件

/// <summary>
        /// 上传文件至FTP的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button3_Click(object sender, EventArgs e)
        {
            string pName, path;
            OpenFileDialog open = new OpenFileDialog();

            if (open.ShowDialog() == DialogResult.OK)
            {
                pName = System.IO.Path.GetFileName(open.FileName); //获取选择的文件名                            
                path = open.FileName;//文件的路径名         
                try
                {

                    FtpClient client = new FtpClient(textBox1.Text);
                    client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
                    client.Connect();
                    client.UploadFile(@"" + path + "", "/" + pName + "");
                    client.Disconnect();
                    MessageBox.Show("已上传文件!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                    return;
                }
            }
        }

4.下载文件

/// <summary>
/// 从FTP下载文件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button4_Click(object sender, EventArgs e)
{
    FolderBrowserDialog close = new FolderBrowserDialog();
    if (close.ShowDialog() == DialogResult.OK)
    {
        string name = this.listView1.FocusedItem.SubItems[0].Text;
        //name += "             ";
        FtpClient client = new FtpClient(textBox1.Text);
        client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
        client.Connect();
        client.DownloadFile("" + close.SelectedPath + "" + name + "", "/" + name + "");
        MessageBox.Show("已下载文件!");
    }
    close.Dispose();
}

5.删除文件

/// <summary>
/// 删除FTP中文件的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button5_Click(object sender, EventArgs e)
{
    string name = this.listView1.FocusedItem.SubItems[0].Text;
    //name += "             ";
    FtpClient client = new FtpClient(textBox1.Text);
    client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
    client.Connect();
    client.DeleteFile("/" + name + "");
    MessageBox.Show("已删除文件!");
}

6.定时上传,新建了一个Observer类定义事件,并通过定时器实时监控,到达设定时间时立刻上传指定文件夹中所有的文件。

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

namespace fluentFTP
{
    class Observer
    {
        /// <summary>
        /// 需要执行的事件
        /// </summary>
        public void DoEvent()
        {
            using (var ftp = new FtpClient("" + GlobalVariables.ftpip + "", "" + GlobalVariables.username + "", "" + GlobalVariables.password + ""))
            {
                ftp.Connect();
                // 上传文件夹中的全部文件
                ftp.UploadDirectory(@""+GlobalVariables.path+"", @"" + GlobalVariables.time + "", FtpFolderSyncMode.Update);
            }
        }
    }
}

操作演示:

interface

图3-主界面

在登录信息中输入FTP的IP地址、用户名和密码,点击连接即可在listView中查看服务器信息;

点击上传按钮,在对话框中选择需要上传的文件,即可上传;

选中listView中的文件后点击下载按钮,即可下载;

选中listView中的文件后点击删除按钮,即可删除;

在设定上传时间文本框中输入时间,格式为HH:mm:ss(20:00:00),在本地文件路径中输入需要上传的文件夹路径,如D:\testFiles,点击开启按钮即可,当到达设定的时间时会上传文件夹中所有的文件,成功后会有弹框提示,点击关闭按钮会停止定时器。

代码全文:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using FluentFTP;
using System.Net;
using System.Windows.Forms;

namespace fluentFTP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        System.Timers.Timer t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为1000毫秒;
        
        /// <summary>
        /// 连接FTP的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button1_Click(object sender, EventArgs e)
        {
            listView1.View = View.Details;//显示Listview的列标题
            FtpClient client = new FtpClient(textBox1.Text);
            client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
            client.Connect();

            string pname, psize, pdate;
            
            //listView添加信息
            foreach (FtpListItem item in client.GetListing(""))
            {
                long size = client.GetFileSize(item.FullName);
                psize = size.ToString();
                pname = item.FullName;
                DateTime time = client.GetModifiedTime(item.FullName);
                pdate = time.ToString();

                ListViewItem lvi = new ListViewItem(item.FullName);
                lvi.SubItems.Add(psize);
                lvi.SubItems.Add(pdate);
                this.listView1.Items.Add(lvi);
            }

            button1.Enabled = false;
            button2.Enabled = true;
            button3.Enabled = true;
            button4.Enabled = true;
            button5.Enabled = true;
        }

        /// <summary>
        /// 断开FTP的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button2_Click(object sender, EventArgs e)
        {
            FtpClient client = new FtpClient(textBox1.Text);
            client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
            client.Disconnect();
            this.listView1.Items.Clear();

            button1.Enabled = true;
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            button5.Enabled = false;
        }

        /// <summary>
        /// 上传文件至FTP的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button3_Click(object sender, EventArgs e)
        {
            string pName, path;
            OpenFileDialog open = new OpenFileDialog();

            if (open.ShowDialog() == DialogResult.OK)
            {
                pName = System.IO.Path.GetFileName(open.FileName); //获取选择的文件名                            
                path = open.FileName;//文件的路径名         
                try
                {

                    FtpClient client = new FtpClient(textBox1.Text);
                    client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
                    client.Connect();
                    client.UploadFile(@"" + path + "", "/" + pName + "");
                    client.Disconnect();
                    MessageBox.Show("已上传文件!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                    return;
                }
            }
        }
        /// <summary>
        /// 从FTP下载文件的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button4_Click(object sender, EventArgs e)
        {

            FolderBrowserDialog close = new FolderBrowserDialog();
            if (close.ShowDialog() == DialogResult.OK)
            {

                string name = this.listView1.FocusedItem.SubItems[0].Text;
                //name += "             ";

                FtpClient client = new FtpClient(textBox1.Text);
                client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
                client.Connect();
                client.DownloadFile("" + close.SelectedPath + "" + name + "", "/" + name + "");


                MessageBox.Show("已下载文件!");

            }
            close.Dispose();
        }

        /// <summary>
        /// 删除FTP中文件的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button5_Click(object sender, EventArgs e)
        {
            string name = this.listView1.FocusedItem.SubItems[0].Text;
            //name += "             ";
            FtpClient client = new FtpClient(textBox1.Text);
            client.Credentials = new NetworkCredential(textBox2.Text, textBox3.Text);
            client.Connect();
            client.DeleteFile("/" + name + "");
            MessageBox.Show("已删除文件!");
        }

        private void Form1_Load(object sender, EventArgs e)
        {                     
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            button5.Enabled = false;
            button9.Enabled = false;
        }

        /// <summary>
        /// 启动定时器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button8_Click(object sender, EventArgs e)
        {
            t.Elapsed += new System.Timers.ElapsedEventHandler(timer_Tick);//到达时间的时候执行事件;
            t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
            t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
            t.Start();//启动定时器
            button9.Enabled = true;
        }
   

        /// <summary>
        /// 停止定时器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button9_Click(object sender, EventArgs e)
        {
            t.Stop();//停止定时器
        }

        /// <summary>
        /// 定时器事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer_Tick(object sender, EventArgs e)
        {
            Observer observer = new Observer();
            string now = DateTime.Now.ToString("HH:mm:ss");

            //全局变量赋值
            GlobalVariables.ftpip = textBox1.Text.ToString().Trim();
            GlobalVariables.username = textBox2.Text.ToString().Trim();
            GlobalVariables.password = textBox3.Text.ToString().Trim();
            GlobalVariables.path = textBox5.Text.ToString().Trim();
            GlobalVariables.time = DateTime.Now.ToString("D");

            //设置固定时间要执行的事件
            if (now == textBox4.Text.ToString().Trim())
            {
                observer.DoEvent();
                MessageBox.Show("文件已按时上传!");
            }
        }

        private void Button6_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("IEXPLORE.EXE", "https://www.daboke.com");//欢迎访问大博客!
        }

        private void Button7_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("IEXPLORE.EXE", "https://www.daboke.com");//欢迎访问大博客!
        }
    }
}

代码链接:

fluentFTP

原文链接:

https://www.daboke.com/program/fluentftp.html

You may also like...

发表评论

邮箱地址不会被公开。

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixin pay_weixin
最喜欢你一言不合就打赏的样子了^_^