C# FTP增、删、改、查、创建多级目录、自动重连、切换目录

参考链接:https://www.cnblogs.com/wpf123/archive/2010/11/13/2052932.html
https://www.cnblogs.com/big-lll/p/9224476.html

1. FtpHelper.cs

using System; 
using System.IO;
using System.Net;
using System.Text;
using System.Threading;

namespace AtovoFtpUploadFiles
{ 
    public class FtpHelper
    {
        private string ftpServerIP;
        private string ftpRemotePath;
        private string ftpUserID;
        private string ftpPassword;
        public string ftpURI; 
        private string ftpServerPort;
        private bool ftpMode;
        /// <summary>
        /// 连接FTP
        /// </summary>
        /// <param name="FtpServerIP">FTP连接地址</param>
        /// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
        /// <param name="FtpUserID">用户名</param>
        /// <param name="FtpPassword">密码</param>
        public FtpHelper(string FtpServerIP, string FtpServerPort, string FtpRemotePath, string FtpUserID, string FtpPassword,bool FtpMode)
        {
            ftpServerIP = FtpServerIP;
            ftpRemotePath = FtpRemotePath;
            ftpUserID = FtpUserID;
            ftpPassword = FtpPassword;
            ftpServerPort = FtpServerPort;
            ftpMode = FtpMode;
            ftpURI = "ftp://" + ftpServerIP + ":" + ftpServerPort + "/";
            if (!string.IsNullOrEmpty(ftpRemotePath))
            {
                ftpURI = ftpURI + ftpRemotePath + "/";
            }
        }

        /// <summary>  
        /// 上传  
        /// </summary>   
        public void UploadFile(string filename)
        {
            FileInfo fileInf = new FileInfo(filename);
            FtpWebRequest reqFTP;
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileInf.Name));
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
            reqFTP.KeepAlive = false;
            reqFTP.UsePassive = ftpMode;
            reqFTP.UseBinary = true;
            reqFTP.ContentLength = fileInf.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            FileStream fs = fileInf.OpenRead();
            try
            {
                Stream strm = reqFTP.GetRequestStream();
                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)
            {
                throw new Exception("上传  Error --> " + ex.Message);
            }
        }

        /// <summary>
        /// 上传文件到远程ftp
        /// </summary>
        /// <param name="path">本地的文件目录</param>
        /// <param name="name">文件名称</param>
        /// <returns></returns>
        public bool UploadFilePath(string path, string name, string FtpPath)
        {
            FileInfo f = new FileInfo(path);
            _ = path.Replace("\\", "/");
            path = ftpURI + FtpPath + name; //这个路径是我要传到ftp目录下的这个目录下
            FtpWebRequest reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(path)); 
            reqFtp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFtp.KeepAlive = false;
            reqFtp.UsePassive = ftpMode;
            reqFtp.UseBinary = true;
            reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
            reqFtp.ContentLength = f.Length;
            int buffLength = 2048;
            byte[] buff = new byte[buffLength];
            int contentLen;
            FileStream fs = f.OpenRead();
            try
            {
                Stream strm = reqFtp.GetRequestStream();
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
                fs.Close();
                return true;
            }
            catch (Exception ex)
            {
                throw new Exception("上传  Error --> " + ex.Message);
            }
        }

        /// <summary>
        /// 下载
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="fileName"></param>
        public string DownloadFile( string fileName, string filePath)
        {
            FtpWebRequest reqFTP;
            try
            {
                FileStream outputStream = new FileStream(filePath + "\\" + fileName.Trim(), FileMode.Create);
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName.Trim()));
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                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, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                return fileName + " 下载失败 --> " + ex.Message;
            }
            return string.Empty;
        }

        /// <summary>
        /// 删除文件
        /// </summary>
        /// <param name="fileName"></param>
        public string DeleteFile(string fileName)
        {
            try
            {
                string uri = ftpURI + fileName;
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;

                string result = string.Empty;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                long size = response.ContentLength;
                Stream datastream = response.GetResponseStream();
                StreamReader sr = new StreamReader(datastream);
                result = sr.ReadToEnd();
                sr.Close();
                datastream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                return "删除失败 --> " + ex.Message + "  文件名:" + fileName;
            }

            return string.Empty;
        }

        /// <summary>
        /// 删除文件夹
        /// </summary>
        /// <param name="folderName"></param>
        public void RemoveDirectory(string folderName)
        {
            try
            {
                string uri = ftpURI + folderName;
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;

                string result = String.Empty;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                long size = response.ContentLength;
                Stream datastream = response.GetResponseStream();
                StreamReader sr = new StreamReader(datastream);
                result = sr.ReadToEnd();
                sr.Close();
                datastream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FtpHelper  Error --> " + ex.Message);
            }
        }
        
        /// <summary>
        /// 获取当前目录下明细(包含文件和文件夹)
        /// </summary>
        /// <returns>名称数组</returns>
        public string[] GetFilesDetailList()
        {
            try
            {
                StringBuilder result = new StringBuilder();
                FtpWebRequest ftp;
                ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
                ftp.UseBinary = true;
                ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails; 
                ftp.KeepAlive = false; 
                ftp.UsePassive = ftpMode;//表示连接类型为主动模式
                WebResponse response = ftp.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
                //while (reader.Read() > 0)
                //{
                //}
                string line = reader.ReadLine();
                //line = reader.ReadLine();
                //line = reader.ReadLine();
                while (line != null)
                {
                    result.Append(line);
                    result.Append("\n");
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf("\n"), 1);
                reader.Close();
                response.Close();
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                throw new Exception("文件列表获取  Error --> " + ex.Message);
            }
        }

        /// <summary>
        /// 获取当前目录下文件列表(仅文件)
        /// </summary>
        /// <returns></returns>
        public string[] GetFileList(string mask)
        {
            StringBuilder result = new StringBuilder();
            FtpWebRequest reqFTP;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                WebResponse response = reqFTP.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);

                string line = reader.ReadLine();
                while (line != null)
                {
                    if (line.ToLower().IndexOf(mask) > 0)
                    {
                        result.Append(line);
                        result.Append("\n");
                    }
                    //if (mask.Trim() != string.Empty && mask.Trim() != "*.*")
                    //{
                    //    string mask_ = mask.Substring(0, mask.IndexOf("*"));
                    //    if (line.Substring(0, mask_.Length) == mask_)
                    //    {
                    //        result.Append(line);
                    //        result.Append("\n");
                    //    }
                    //}
                    //else
                    //{
                    //    result.Append(line);
                    //    result.Append("\n");
                    //}
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf('\n'), 1);
                reader.Close();
                response.Close();
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                throw new Exception("FtpHelper  Error --> " + ex.Message);
            }
        }

        /// <summary>
        /// 获取当前目录下所有的文件夹列表(仅文件夹)
        /// </summary>
        /// <returns></returns>
        public string[] GetDirectoryList()
        {
            string[] drectory = GetFilesDetailList();
            string m = string.Empty;
            foreach (string str in drectory)
            {
                int dirPos = str.IndexOf("<DIR>");
                if (dirPos > 0)
                {
                    /*判断 Windows 风格*/
                    m += str.Substring(dirPos + 5).Trim() + "\n";
                }
                else if (str.Trim().Substring(0, 1).ToUpper() == "D")
                {
                    /*判断 Unix 风格*/
                    string dir = str.Substring(54).Trim();
                    if (dir != "." && dir != "..")
                    {
                        m += dir + "\n";
                    }
                }
            } 
            char[] n = new char[] { '\n' };
            return m.Split(n);
        }


         //目录解析
        public string FtpParseDirectory(string destFilePath)
        {
            return destFilePath.Substring(0, destFilePath.LastIndexOf("/"));
        }
        //判断文件的目录是否存,不存则创建  
        public void FtpCheckDirectoryExist(string destFilePath)
        {
            string fullDir = FtpParseDirectory(destFilePath);   //目录解析
            string[] dirs = fullDir.Split('/');
            string curDir = "/";
            for (int i = 0; i < dirs.Length; i++)
            {
                string dir = dirs[i];
                try
                {
                    curDir += dir + "/";    //一层一层创建
                    MakeDir(curDir);        //创建文件夹
                }
                catch (Exception)
                { 
                }
            }
        }
         
        /// <summary>
        /// 判断当前目录下指定的子目录是否存在
        /// </summary>
        /// <param name="RemoteDirectoryName">指定的目录名</param>
        public bool DirectoryExist(string RemoteDirectoryName)
        { 
            string[] dirList = GetDirectoryList();
            foreach (string str in dirList)
            {
                if (str.Trim() == RemoteDirectoryName.Trim())
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 判断当前目录下指定的文件是否存在
        /// </summary>
        /// <param name="RemoteFileName">远程文件名</param>
        public bool FileExist(string RemoteFileName)
        { 
            string[] fileList = GetFileList("*.*");
            foreach (string str in fileList)
            {
                if (str.Trim() == RemoteFileName.Trim())
                {
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 创建文件夹
        /// </summary>
        /// <param name="dirName"></param>
        public void MakeDir(string dirName)
        {
            FtpWebRequest reqFTP;
            try
            {
                // dirName = name of the directory to create.
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
                reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();

                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            { 
                throw new Exception("FtpHelper MakeDir Error --> " + ex.Message);
            }
        }
       
        /// <summary>
        /// 获取指定文件大小
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public long GetFileSize(string filename)
        {
            FtpWebRequest reqFTP;
            long fileSize = 0;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
                reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
                reqFTP.UseBinary = true;
                reqFTP.UsePassive = ftpMode;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                fileSize = response.ContentLength;

                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FtpHelper GetFileSize Error --> " + ex.Message);
            }
            return fileSize;
        }

        /// <summary>
        /// 改名
        /// </summary>
        /// <param name="currentFilename"></param>
        /// <param name="newFilename"></param>
        public void ReName(string currentFilename, string newFilename)
        {
            FtpWebRequest reqFTP;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
                reqFTP.Method = WebRequestMethods.Ftp.Rename;
                reqFTP.RenameTo = newFilename;
                reqFTP.UseBinary = true;
                reqFTP.UsePassive = ftpMode;
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("FtpHelper ReName Error --> " + ex.Message);
            }
        }

        /// <summary>
        /// 移动文件
        /// </summary>
        /// <param name="currentFilename"></param>
        /// <param name="newFilename"></param>
        public void MovieFile(string currentFilename, string newDirectory)
        {
            ReName(currentFilename, newDirectory);
        }

        /// <summary>
        /// 切换当前目录
        /// </summary>
        /// <param name="DirectoryName"></param>
        /// <param name="IsRoot">true 绝对路径   false 相对路径</param>
        public void GotoDirectory(string DirectoryName, bool IsRoot)
        {
            if (IsRoot)
            {
                ftpRemotePath = DirectoryName;
            }
            else
            {
                ftpRemotePath += DirectoryName + "/";
            }
            //ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
            ftpURI = "ftp://" + ftpServerIP + ":" + ftpServerPort + "/";
            if (!string.IsNullOrEmpty(ftpRemotePath))
            {
                ftpURI += ftpRemotePath  ;
            }
        }
    }
}  

2. AtovoFtpUploadFiles .cs

namespace Demo
{
    public class AtovoFtpUploadFiles : Form
    {
        #region 变量
        [DllImport("user32.dll")]//引用DLL 弹出提示框,3秒后自动关闭 父窗口句柄没有直接用0代替
        public static extern int MessageBoxTimeoutA(IntPtr hWnd, string msg, string Caps, int type, int Id, int time);
        private string mSelectFile = string.Empty;
        private int mSelectIndex = -1;
        private readonly Settings settings = new Settings(); //记忆窗体配置参数
        private string Sign = "OK-";                //上传完成 标记
        public static string RegExpStr = @"(.*)$";  //正则表达式
        private FtpHelper ftpHelper = null;         
        private bool FtpMode=false;                 //主动模式
        
        //服务器 192.168.1.252
        //密码 YTO_admin
        #endregion
        public AtovoFtpUploadFiles()
        {
            InitializeComponent();
            Set.LogServerPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "LogServer/";  //获取或设置包含该应用程序的目录的名称。 
            #region 读取上次保存的数据
            txtUserName.Text = settings.txtUserNameSettings;            //服务器名称     
            TextBoxPassword.Text = settings.TextBoxPasswordSettings;    //服务器用户密码
            TextBoxServer.Text = settings.TextBoxServerSettings;        //服务器IP
            rbActive.Checked = settings.rbActiveSettings;               //FTP模式-主动
            rbPassive.Checked = settings.rbPassiveSettings;             //FTP模式-被动
            textBoxFilePath.Text = settings.textBoxFilePathSettings;  //搜索目录 
            checkBoxReboot.Checked = settings.checkBoxRebootSettings;   //开机启动 
            #endregion
            if (rbActive.Checked)
            {
                FtpMode = false; //主动模式
            }
            else if (rbPassive.Checked)
            {
                FtpMode = true; //被动模式 }
            }
        }
        #region 复制流
        public static void CopyStream(Stream i, Stream o)        //复制流
        {
            byte[] b = new byte[32768];
            while (true)
            {
                int r = i.Read(b, 0, b.Length);
                if (r <= 0)
                    return;
                o.Write(b, 0, r);
            }
        }
        #endregion
        #region 清理资源
        protected override void Dispose(bool disposing)        //清理所有正在使用的资源。
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }
        #endregion

        #region 连接FTP 
        private void FtpConnect()
        {
            if (TextBoxServer.Text.Trim() == "")
            {
                TextBoxServer.Focus();
                return;
            }
            if (txtUserName.Text.Trim() == "")
            {
                txtUserName.Focus();
                return;
            }
            if (TextBoxPassword.Text.Trim() == "")
            {
                TextBoxPassword.Focus();
                return;
            } 
            ftpHelper = new FtpHelper(TextBoxServer.Text.Trim(), "21", "", txtUserName.Text.Trim(), TextBoxPassword.Text.Trim(), FtpMode);
            btnConnect.Enabled = false;
            btnDisConnect.Enabled = true;
            btnUpload.Enabled = true;
            buttonSearchStart.Enabled = true;
            listServer.Items.Clear();
            GetFtpList();       //获得的Ftp文件列表
            SearchStartFiles(); //搜索指定文件并上传 
        }
        private void btnConnect_Click(object sender, EventArgs e)
        {
            FtpConnect(); //连接FTP
        }
        #endregion 
        #region FTP上传下载的进度条,FTP状态
        //private void ftpClient_FtpLogEvent(object sender, FTP.FtpClient.FtpLogEventArgs e)
        //{
        //    this.listLog.Items.Add(e.Log);
        //}
        //private void ftpClient_FtpTranProgressEvent(object sender, FTP.FtpClient.FtpTranProgressEventArgs e)
        //{
            //this.Enabled = false;
            //this.progressBar1.Value = (int)e.Percent;
            //Application.DoEvents();
            //
            //if (this.progressBar1.Value == 100)
            //{
            //    this.Enabled = true;
            //    this.progressBar1.Value = 0;
            //}
        //}
        #endregion 
        #region 获得的Ftp文件列表 
        private void GetFtpList()
        {
            try
            {
                string[] Files = ftpHelper.GetFilesDetailList(); 
                string type = "";
                string size = "";
                string name = "";
                string Data = "";
                string Time = "";
                foreach (string file in Files)
                {
                    if (file == "")
                        break;

                    name = file.TrimEnd(new char[] { ' ' }).Substring(39);
                    type = file.Substring(24, 5);
                    size = file.Substring(29, 10).Trim();
                    Data = file.Substring(18, 7);
                    Time = file.Substring(0, 17);//日期
                    ListViewItem lvi = new ListViewItem(name);
                    lvi.SubItems.Add(type);
                    lvi.SubItems.Add(size);
                    lvi.SubItems.Add(Data);
                    lvi.SubItems.Add(Time);
                    listServer.Items.Add(lvi);
                }
            }
            catch (Exception ex)
            {
                listLog.Items.Add("读取服务器文件列表错误: "+ex.Message.ToString()); 
            }
        }
        #endregion

        #region 窗体打开关闭事件
        private void Form1_Load(object sender, EventArgs e)
        { 
            CheckForIllegalCrossThreadCalls = false; //取消对跨线程的访问检查 
            RegExpStr = ReaderLinesFromFile("../Config.txt", 2, 1);
            listLog.Items.Add("正则表达式:" + RegExpStr);
            FtpConnect();       //连接FTP  

            LogT.LogServerName = "LogServer.txt";    //日志名称
            LogT.LogServerPath = Set.LogServerPath;  //日志路径
            LogT.LogServerStr = "正则表达式:" + RegExpStr + "\r\n";          //日志内容
            Thread threadLogServer = new Thread(LogT.LogServer);
            threadLogServer.Priority = ThreadPriority.Lowest;
            threadLogServer.IsBackground = true;
            threadLogServer.Start();
        }
        private void AtovoFtpUploadFiles_Resize(object sender, EventArgs e)     //最小化
        { 
        }
        #region 保存配置信息
        private void SaveSettings()//保存配置信息
        { 
            settings.txtUserNameSettings = txtUserName.Text;            //服务器名称     
            settings.TextBoxPasswordSettings = TextBoxPassword.Text;    //服务器用户密码
            settings.TextBoxServerSettings = TextBoxServer.Text;        //服务器IP
            settings.rbActiveSettings = rbActive.Checked;               //FTP模式-主动
            settings.rbPassiveSettings = rbPassive.Checked;             //FTP模式-被动
            settings.textBoxFilePathSettings = textBoxFilePath.Text;    //搜索目录 
            settings.checkBoxRebootSettings = checkBoxReboot.Checked;   //开机启动
            settings.Save();    //保存配置信息
        }
        #endregion
        private void AtovoFtpUploadFiles_FormClosing(object sender, FormClosingEventArgs e) 
        {
            SaveSettings(); //保存配置信息 
            if (e.CloseReason == CloseReason.UserClosing)//关闭到系统托盘
            {
                e.Cancel = true;
                this.Hide(); 
            }
        } 
        #endregion
        #region FTP断开连接
        private void FtpDisConnect()
        {
            this.listServer.Items.Clear();
            btnConnect.Enabled = true;
            btnDisConnect.Enabled = false;
            btnUpload.Enabled = false;
            btnDownload.Enabled = false;
            btnDelete.Enabled = false;
            buttonSearchStart.Enabled = false;
            buttonSearchStop.Enabled = false;
            this.lblServerPath.Text = "/";
        }
        private void btnDisConnect_Click(object sender, System.EventArgs e)
        {
            SearchStopFiles();  //停止搜索
            Thread.Sleep(500);
            FtpDisConnect();    //FTP断开连接
        }
        #endregion
        #region 上传文件
        private void FtpUpload()
        {
            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    ftpHelper.UploadFile(open.FileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                    return;
                }
                listLog.Items.Add("上传成功:" + ftpHelper.ftpURI);
                this.listServer.Items.Clear();
                if (lblServerPath.Text != "/")
                {
                    ListViewItem lvi = new ListViewItem("..");
                    this.listServer.Items.Add(lvi);
                }
                GetFtpList();
            }
            open.Dispose();
        }
        private void btnUpload_Click(object sender, System.EventArgs e)
        {
            FtpUpload();
        }
        #endregion
        #region 下载文件
        private void btnDownload_Click(object sender, System.EventArgs e)
        {
            FolderBrowserDialog fbg = new FolderBrowserDialog();
            if (fbg.ShowDialog() == DialogResult.OK)
            {
                ftpHelper.DownloadFile(mSelectFile, fbg.SelectedPath);
                MessageBox.Show("下载成功!");
                this.btnDelete.Enabled = false;
                this.btnDownload.Enabled = false;
            }
            fbg.Dispose();
        }
        #endregion 
        #region 删除文件
        private void btnDelete_Click(object sender, System.EventArgs e)
        {
            try
            {
                ftpHelper.DeleteFile(mSelectFile);
                MessageBox.Show("删除完成!");
                this.listServer.Items.RemoveAt(mSelectIndex);
                this.btnDelete.Enabled = false;
                this.btnDownload.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        #endregion
        #region 单击文件列表事件
        private void listServer_Click(object sender, System.EventArgs e)
        {
            mSelectIndex = listServer.SelectedIndices[0];
            mSelectFile = this.listServer.Items[mSelectIndex].Text;
            if (mSelectFile == "..")
                return;
            string type = this.listServer.Items[mSelectIndex].SubItems[1].Text.Trim();

            if (type == "")
            {
                btnDelete.Enabled = true;
                btnDownload.Enabled = true;
                return;
            }
            else
            {
                btnDelete.Enabled = false;
                btnDownload.Enabled = false;
            }
        }
        #endregion
        #region 双击激活一项时发生
        private void listServer_ItemActivate(object sender, System.EventArgs e)
        {
            try
            { 
                mSelectIndex = listServer.SelectedIndices[0];
                AtovoFtpUploadFiles form1 = this;
                string name = form1.listServer.Items[mSelectIndex].Text;
                string type = "";
                if (name != "..")
                {
                    type = listServer.Items[mSelectIndex].SubItems[1].Text.Trim();
                }
                if (name == "")
                    return;
                if ((type == "") && (name != ".."))
                {
                    return;
                }
                this.listServer.Items.Clear();
                if (name == "..")
                {
                    string str = this.lblServerPath.Text.TrimEnd(new char[] { '/' });
                    int nPos = str.LastIndexOf('/');
                    this.lblServerPath.Text = str.Substring(0, nPos + 1);
                    if (lblServerPath.Text != "/")
                    {
                        ListViewItem lvi = new ListViewItem("..");
                        this.listServer.Items.Add(lvi);
                    }
                    this.btnDelete.Enabled = false;
                    this.btnDownload.Enabled = false;
                }
                else
                {
                    ListViewItem lvi = new ListViewItem("..");
                    this.listServer.Items.Add(lvi);
                    this.lblServerPath.Text += name + "/";
                }
                ftpHelper.GotoDirectory(name,false);
                GetFtpList();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }
        #endregion

        #region 搜索指定文件按钮
        //开始搜索线程
        private ulong QuantityFound = 0;  //找到的数量 
        private bool ThreadRun = true; //开始、停止搜索标志 
        private void SearchStartFiles()
        { 
                Thread t = new Thread(FileScan);  //多线程
                t.IsBackground = true; //设置为后台线程
                t.Start();//开启线程
                ThreadRun = true;  //开始、停止搜索标志  
                buttonSearchStart.Enabled = false;
                buttonSearchStop.Enabled = true; 
        }
        private void buttonSearchStart_Click(object sender, EventArgs e)
        {
            SearchStartFiles(); //搜索指定文件并上传
        }
        //停止搜索线程

        private void SearchStopFiles()
        {
            ThreadRun = false;  //开始、停止搜索标志 
            buttonSearchStart.Enabled = true;
            buttonSearchStop.Enabled = false;
        }
        private void buttonSearchStop_Click(object sender, EventArgs e)
        {
            SearchStopFiles(); //停止搜索
        }
        #endregion
        #region 扫描文件
        private void FileScan()
        {
            string DirName = textBoxFilePath.Text;      //路径名 
            QuantityFound = 0; //恢复
            while (ThreadRun)
            {
                Thread.Sleep(200);
                GetFileName(DirName);   
            }
        }
        private void GetFileName(string DirName)
        {
            string NameSign ;    //新文件名
            string NamePath ;    //路径 
            DirectoryInfo dir = new DirectoryInfo(DirName);            //文件夹信息
            if (null != dir.Parent && dir.Attributes.ToString().IndexOf("System") > -1)  // 如果非根路径且是系统文件则跳过
            {
                return;
            }
            try      // 获得所有文件
            {
                FileInfo[] finfo = dir.GetFiles();
                string fname = string.Empty;
                DirectoryInfo[] dinfo = dir.GetDirectories();
                foreach (DirectoryInfo IDir in dinfo)
                {
                    GetFileName(IDir.FullName);   //查找子文件夹中是否有符合要求的文件 
                }
                foreach (FileInfo Ifinfo in finfo)
                {
                    fname = Ifinfo.Name;
                    string[] SplitData = Ifinfo.Name.Split('.'); //截取需要的信息 
                    if (IsNatural_Number(SplitData[0]) && !Ifinfo.Name.Contains(Sign))   //判断文件是否包含查询名 && 包含标记
                    {
                        try
                        {
                            NameSign = Sign + Ifinfo.Name;                                  //新文件名=标记+原文件名
                            NamePath = Regex.Replace(Ifinfo.FullName, Ifinfo.Name, "");     //路径=总路径-原名称  
                            string[] Dirs = NamePath.Split(':');                            //分割字符
                            string DirsPath= Dirs[1].Replace('\\', '/');                    //替换为左斜杠

                            ftpHelper.FtpCheckDirectoryExist(DirsPath);                      //判断FTP是否有该目录,无:则创建
                            bool FtpUpload = ftpHelper.UploadFilePath(Ifinfo.FullName, Ifinfo.Name, DirsPath);//上传至指定目录
                            listLog.Items.Add("上传成功:" + ftpHelper.ftpURI + DirsPath + Ifinfo.Name);
                            if(FtpUpload) 
                                QuantityFound++;        //扫描到的数量 ++
                            Thread.Sleep(100);
                            FileInfo f = new FileInfo(Ifinfo.FullName);  
                            f.MoveTo(NamePath + NameSign);                                  //修改名称=路径+新名称
                            string DleFile = deleteOneFile(NamePath + NameSign);            //删除文件 
                            listLog.Items.Add(DleFile);

                            listLogRoll();          //滚动到底部
                            if (ThreadRun == false)
                                return;
                        }
                        catch (Exception ex)
                        {
                            listLog.Items.Add(ex.Message.ToString()); 
                            LogT.LogServerName = "LogServer.txt";    //日志名称
                            LogT.LogServerPath = Set.LogServerPath;  //日志路径
                            LogT.LogServerStr = DateTime.Now.ToString("[yyyy/MM/dd HH:mm:ss:fff] ") + ex.Message + "\r\n";          //日志内容
                            Thread threadLogServer = new Thread(LogT.LogServer);
                            threadLogServer.Priority = ThreadPriority.Lowest;
                            threadLogServer.IsBackground = true;
                            threadLogServer.Start();
                            return;
                        }
                    }
                    //else if (Ifinfo.Name.Contains(Sign))
                    //{
                    //    Thread.Sleep(100);
                    //    string DleFile  =  deleteOneFile(Ifinfo.FullName);        //删除文件    
                    //    listLog.Items.Add(  "删除:" + DleFile);
                    //}
                }
            }
            catch (Exception)
            {
                return;
            }
            finally
            {
                label7.Text =   " 已找到:" + QuantityFound.ToString();  //扫描总数量,和已找到的数量
            }
        } 
        #region 读取指定行数txt文件
        /// <summary>
        /// 读取指定行数txt文件
        /// </summary>
        /// <param name="FileName">文件总目录名</param>
        /// <param name="StartLine">第几行开始</param>
        /// <param name="Linecount">读取行数</param>
        /// <returns></returns>
        private string ReaderLinesFromFile(string FileName, int StartLine, int Linecount)
        {
            int i = 0;
            StringBuilder sb = new StringBuilder(); 
            StreamReader reader = new StreamReader(FileName);
            while (!reader.EndOfStream)
            {
                if (i >= StartLine)
                {
                    if (Linecount < 1)
                        sb.Append(reader.ReadToEnd());
                    else
                        sb.Append(reader.ReadLine());
                }
                else
                    reader.ReadLine();
                i++;
                if (i >= Linecount + StartLine) break;
            }
            reader.Close();
            reader.Dispose();
            return sb.ToString(); 
        }
        #endregion
        #region 删除本地文件
        private static string deleteOneFile(string fileFullPath)
        {
            // 根据路径字符串判断是文件还是文件夹
            FileAttributes attr = File.GetAttributes(fileFullPath);
            // 根据具体类型进行删除
            if (attr == FileAttributes.Directory)
            {
                Directory.Delete(fileFullPath, true); //删除文件夹
            }
            else
            {
                File.Delete(fileFullPath);//删除文件
            }
            File.Delete(fileFullPath);
            return "删除成功:" + fileFullPath;
        }
        #endregion
        #endregion
        #region 窗体最小化到系统托盘 && 开机启动
         //NotifyIcon 双击弹出软件 
         [DllImport("user32.dll", EntryPoint = "GetForegroundWindow", CharSet = CharSet.Auto, ExactSpelling = true)]
         public static extern IntPtr GetF();          //获得本窗体的句柄
         [DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
         public static extern bool SetF(IntPtr hWnd); //设置此窗体为活动窗体
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Visible = true;
            WindowState = FormWindowState.Normal;
            Show(); 
            if (this.Handle != GetF()) //如果本窗口没有获得焦点
                SetF(this.Handle); //设置本窗口获得焦点
        }
        //右键小图标菜单 - 退出
        private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveSettings();     //保存配置信息
            SearchStopFiles();  //停止搜索
            Thread.Sleep(500);
            FtpDisConnect();    // FTP断开连接
            Application.Exit(); //好像只在主线程可以起作用,而且当有线程,或是阻塞方法的情况下,很容易失灵
            Close();
        }

        //开机启动
        private void checkBoxReboot_CheckedChanged(object sender, EventArgs e)
        {
            string R_startPath = Application.ExecutablePath;
            if (checkBoxReboot.Checked == true)
            {
                RegistryKey R_local = Registry.LocalMachine;
                RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
                R_run.SetValue("BirthdayTipF", R_startPath);
                R_run.Close();
                R_local.Close();
            }
            else
            {
                try
                {
                    RegistryKey R_local = Registry.LocalMachine;
                    RegistryKey R_run = R_local.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
                    R_run.DeleteValue("BirthdayTipF", false);
                    R_run.Close();
                    R_local.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("您需要管理员权限修改", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }

            }
        }
        #endregion
        #region 正则表达式过滤
        private string[] RegExp = new string[7]; //{ @"(.*)$" };
       
        private void textBoxCodeText_TextChanged(object sender, EventArgs e) //测试
        {
            if (IsNatural_Number(textBoxCodeText.Text))
            {
                listLog.Items.Add(".成功:"  );
            }
            else
            {
                listLog.Items.Add(".失败:"  );
            }
        }
        #region 正则表达式过滤
        public static bool IsNatural_Number(string str)
        {
            Regex reg1 = new Regex(RegExpStr);
            return reg1.IsMatch(str);
        }
        private void textBoxCodeMax_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar != '\b')//这是允许输入退格键
            {
                if ((e.KeyChar < '0') || (e.KeyChar > '9'))//这是允许输入0-9数字
                {
                    e.Handled = true;
                }
            }
        }
        #endregion

        #endregion
        #region 显示框行数限制,自动滚动
        private void listLog_SelectedIndexChanged(object sender, EventArgs e)
        { 
        }
        private void listLogRoll ( )
        {
            listLog.TopIndex = listLog.Items.Count - 1;     //自动滚动
            
            while (listLog.Items.Count > 100)//行数限制
            {
                listLog.Items.RemoveAt(0);  // 删除最早的数据
            }
        }
        #endregion

        private void 日志ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Log f = new Log();
            if (f != null)
            {
                f.MdiParent = this.MdiParent;
                f.Show();
            } 
        }
    }
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值