FTP网络通信程序设计

来源:互联网 发布:glide加载网络图片 编辑:程序博客网 时间:2024/04/19 02:42
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;//添加命名空间引用using System.Net;using System.IO;namespace FTP网络通信程序设计{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        string ftpServerIP;        string ftpUserID;        string ftpPassword;        private void Form1_Load(object sender, EventArgs e)        {            ftpServerIP = "127.0.0.1";            ftpUserID = "anonymous";            textBoxIPAddress.Text = ftpServerIP;            textBoxUserName.Text = ftpUserID;            textBoxPassword.Text = ftpPassword;        }        private void textBoxPassword_TextChanged(object sender, EventArgs e)        {            buttonOK.Enabled = true;        }        private void textBoxUserName_TextChanged(object sender, EventArgs e)        {            buttonOK.Enabled = true;        }        private void buttonOK_Click(object sender, EventArgs e)        {            ftpServerIP = textBoxIPAddress.Text.Trim();            ftpUserID = textBoxUserName.Text.Trim();            ftpPassword = textBoxPassword.Text.Trim();            string[] filenames = GetFilesList();            listBoxFiles.Items.Clear();            try            {                foreach (string filename in filenames)                {                    listBoxFiles.Items.Add(filename);                }            }            catch            {                return;            }        }        public string[] GetFilesList()        {            string[] downloadFiles;            StringBuilder result = new StringBuilder();            //实现文件传输协议客户端            FtpWebRequest reqFTP;            try            {                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));                reqFTP.UseBinary = true;//采用二进制数据类型传输                //获取与FTP服务器通信的凭据                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);                //获取FTP服务器上的文件的简短列表                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;                //提供来自URI的响应                WebResponse response = reqFTP.GetResponse();                //从字节流中读取字符                StreamReader reader = new StreamReader(response.GetResponseStream());                string line = reader.ReadLine();                bool flag = false;                while (line != null)                {                    if (flag) result.Append("\n");                    result.Append(line);                    flag = true;                    line = reader.ReadLine();                }                //去除最后一个多余的换行符                //if (result.Length == 0) return null;                //result.Remove(result.ToString().LastIndexOf('\n'), 1);                reader.Close();                response.Close();                return result.ToString().Split('\n');            }            catch(Exception ex)            {                MessageBox.Show(ex.Message);                downloadFiles = null;                return downloadFiles;            }        }        private void buttonUPload_Click(object sender, EventArgs e)        {            OpenFileDialog opfildlg = new OpenFileDialog();            if (opfildlg.ShowDialog() == DialogResult.OK)            {                Upload(opfildlg.FileName);                string[] filenames = GetFilesList();                listBoxFiles.Items.Clear();                foreach (string file in filenames)                    listBoxFiles.Items.Add(file);                MessageBox.Show("文件上传完毕!!!");            }        }        private void Upload(string filename)        {            FileInfo fileinf = new FileInfo(filename);            //实现文件传输协议客户端            FtpWebRequest reqFTP;            //为指定的URI创建FtpWebRequest对象            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileinf.Name));            //设置用于ftp服务器通信的凭据            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);            //默认为TRUE,在一个命令之后被执行,连接不会关闭            reqFTP.KeepAlive = false;            //指定执行上传命令            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;            reqFTP.UseBinary = true;            reqFTP.ContentLength = fileinf.Length;            int bufflength = 2048;            byte[] buff = new byte[bufflength];            int contentLen;            FileStream fs = fileinf.OpenRead();            try            {                //检索用于向FTP服务器上载数据的流                Stream strm = reqFTP.GetRequestStream();                //每次从文件流中读入2KB                contentLen = fs.Read(buff, 0, bufflength);                while (contentLen != 0)                {                    strm.Write(buff, 0, contentLen);                    contentLen = fs.Read(buff, 0, bufflength);                }                strm.Close();                fs.Close();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message, "文件上传出错!!");            }        }        private void buttonDownLoad_Click(object sender, EventArgs e)        {            FolderBrowserDialog flddlg = new FolderBrowserDialog();            if (listBoxFiles.Text.Trim().Length > 0)            {                if (flddlg.ShowDialog() == DialogResult.OK)                {                    Download(flddlg.SelectedPath, listBoxFiles.Text.Trim());                }                MessageBox.Show("文件下载结束。");            }            else            {                MessageBox.Show("请选择需要下载的文件!!");            }        }        private void Download(string filepath, string filename)        {            FtpWebRequest reqFTP;            try            {                FileStream outputstream = new FileStream(filepath + "\\" + filename, FileMode.Create);                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + filename));                //执行下载命令                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;                reqFTP.UseBinary = true;                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);                //返回FTP服务器响应                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();                //检索从FTP服务器上发送的响应数据的流                Stream ftpStream = response.GetResponseStream();                //获取从FTP服务器上接收的数据的长度                long cl = response.ContentLength;                int buffersize = 2048;                int readcount;                byte[] buffer = new byte[buffersize];                //从当前流读取字节序列,并将此流中的位置提升读取的字节数                readcount = ftpStream.Read(buffer, 0, buffersize);                while (readcount > 0)                {                    outputstream.Write(buffer, 0, buffersize);                    readcount = ftpStream.Read(buffer, 0, buffersize);                }                //关闭两个数据流                ftpStream.Close();                outputstream.Close();            }            catch(Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }}