C#winform 从ftp下载文件、获取文件(夹)的名字

直接用地址下载,引用进度条:

​
        /// <summary>
        /// 从ftp服务器下载文件的功能----带进度条
        /// </summary>
        /// <param name="ftpfilepath">ftp下载的地址</param>
        /// <param name="filePath">保存本地的地址</param>
        /// <param name="ftpfilename">要下载的文件名</param>  
        /// <param name="pb">进度条引用</param>
        /// <returns></returns>
        public static bool Download1(string ftpfilepath, string filePath, string ftpfilename, ProgressBar pb)
        {
            FtpWebRequest reqFtp = null;
            FtpWebResponse response = null;
            Stream ftpStream = null;
            FileStream outputStream = null;
            try
            {
                filePath = filePath.Replace("我的电脑\\", "");//无用
               // String onlyFileName = Path.GetFileName(ftpfilepath);//Path.GetFileName('C:\mydir\myfile.ext')
                                                                 // returns 'myfile.ext'
                string newFileName = filePath + ftpfilename;//给原名字
                if (File.Exists(newFileName))
                {
                    try
                    {
                        File.Delete(newFileName);//如果已有则删除已有
                    }
                    catch { }

                }
                ftpfilepath = ftpfilepath.Replace("\\", "/");//无用
                string url = path + "/"+ ftpfilepath +"/" + ftpfilename;//("ftp://10.12.12.9/iTap3.x/iTapAutoSettle3.x_1240.zip
                //URL是URI的子集,统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。统一资源定位符URL就是用定位的方式实现的URI。
                //URI可被视为定位符(URL),名称(URN)或两者兼备。统一资源名(URN)如同一个人的名称,而统一资源定位符(URL)代表一个人的住址。
                //换言之,URN定义某事物的身份,而URL提供查找该事物的方法。
                reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));//创造连接,创建一个FtpWebRequest对象,指向ftp服务器的uri
                reqFtp.UseBinary = true;//二进制传输,给FtpWebRequest对象设置属性
                reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;// 设置ftp的执行方法(上传,下载等)

                reqFtp.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD);//账户密码
                response = (FtpWebResponse)reqFtp.GetResponse();//获得文件,执行请求
                ftpStream = response.GetResponseStream();//获得流,接收相应流
                long cl = GetFileSize(url);//获得文件大小cl
                int bufferSize = 2048;//时间延迟
                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);//从流里读取的字节数为0时,则下载结束。
                outputStream = new FileStream(newFileName, FileMode.Create);//输出流

                float percent = 0;
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);//写入
                    readCount = ftpStream.Read(buffer, 0, bufferSize);//写入
                    percent = (float)outputStream.Length / (float)cl * 100;//百分之多少了
                    if (percent <= 100)
                    {
                        if (pb != null)
                        {
                            pb.Invoke(new updateui(upui), new object[] { cl, (int)percent, pb });//进度条
                        }
                    }

                }
                
                return true;
            }
            catch (Exception ex)//捕捉
            {
                throw ex;
            }
            finally//异常清理,无论是否异常,都会执行
            {
                if (reqFtp != null)
                {
                    reqFtp.Abort();
                }
                if (response != null)
                {
                    response.Close();
                }
                if (ftpStream != null)
                {
                    ftpStream.Close();
                }
                if (outputStream != null)
                {
                    outputStream.Close();
                }
            }
        }
        public static void upui(long rowCount, int i, ProgressBar PB)//进度条
        {
            try
            {
                PB.Value = i;
            }
            catch { }
        }

        #region 获得文件的大小
        /// <summary>
        /// 获得文件大小
        /// </summary>
        /// <param name="url">FTP文件的完全路径</param>
        /// <returns></returns>
        public static long GetFileSize(string url)//获取大小就要重新连接吗?是的,method只能有一个
        {

            long fileSize = 0;
            try
            {
                FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));//路径创造新的连接
                reqFtp.UseBinary = true;
                reqFtp.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD);//连接
                reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;//方法大小
                FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
                fileSize = response.ContentLength;//获得大小

                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return fileSize;
        }
        #endregion

​

直接全贴上来好了

​
        //===================================================
       

        /// <summary>
        /// 获取当前目录下文件夹
        /// </summary>
        /// <returns></returns>
        public string[] GetFilesDirList()
        {
           
           // string[] downloadFiles;
            try
            {
                StringBuilder result = new StringBuilder();//如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。
                FtpWebRequest ftp;
                ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));//"ftp://10.12.12.9";
                ftp.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD);
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;//目录
                WebResponse response = ftp.GetResponse();//response为一个ftp的WebResponse
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);//读入responses所创建的数据流
                string line = reader.ReadLine();//输入流中的下一行;如果到达了输入流的末尾,则为空引用
                while (line != null)
                {
                    result.Append(line);//)Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。
                    result.Append("\n");
                    line = reader.ReadLine();
                    textBox1.Text = line; 
                }
                result.Remove(result.ToString().LastIndexOf("\n"), 1);//移除最后的换行》?
                reader.Close();
                response.Close();
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        //===================================================
        /// <summary>
        /// 获取选中文件夹下的文件
        /// </summary>
        /// <returns></returns>
        public string[] GetFilesList()//
        {
           
       
            string url = path +"/"+ SelectDir ;//============和之前的文件夹唯一的不同就在于此,加上了文件夹的名字..我会优化的
            try
            {
                StringBuilder result = new StringBuilder();//如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。
                FtpWebRequest ftp;
                ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
                ftp.Credentials = new NetworkCredential(FTPUSERNAME, FTPPASSWORD);
                ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;//目录
                WebResponse response = ftp.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);//读入responses所创建的数据流
                string line = reader.ReadLine();//输入流中的下一行;如果到达了输入流的末尾,则为空引用
                while (line != null)
                {
                    result.Append(line);//)Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。
                    result.Append("\n");
                    line = reader.ReadLine();
                    textBox1.Text = line;
                }
                result.Remove(result.ToString().LastIndexOf("\n"), 1);//移除最后的换行》?
                reader.Close();
                response.Close();
                return result.ToString().Split('\n');
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        //===================================================
        /// <summary>
        ///事实上
        /// </summary>
        private void button2_Click(object sender, EventArgs e)//显示列表、刷新
        {
            listBox1.Items.Clear();
            try
            {
                string[] AllDirs = GetFilesDirList();
                for (int i = 0; i < AllDirs.Length; i++) { //将所有的数组(文件夹名字、信息)给到列表里
                listBox1.Items.Add(AllDirs[i]);
        
            }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //===================================================显示文件

             
        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            string[] AllFiles = GetFilesList();
            int Len = AllFiles.Length;
//            string[] comp = new string[Len];
//            comp = AllFiles.OrderBy(s => int.Parse(Regex.Match(s, @"\d+").Value)).ToArray();
////
            for (int i = 0; i < Len; i++)
            { //将所有的数组(文件夹名字、信息)给到列表里
                listBox1.Items.Add(AllFiles[i]);
//
           }
        }
        //===================================================
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            String StrTemp = listBox1.SelectedItem.ToString();

            // String[] StrConvert = StrTemp.Split('>');//获得文件夹的名字
            //  StrTemp = StrConvert[1];
            // StrTemp = StrTemp.Trim();//删除空格
            // SelectDir = StrTemp;//名字给SelectDir
            // textBox1.Text = StrTemp;//吧文件夹名字显示

            StrTemp = StrTemp.Substring(39);//文件前面有39个奇怪的字符...无论文件与文件夹
            SelectDir = StrTemp;//名字给SelectDir
            textBox1.Text = StrTemp;//吧文件夹名字显示

        }

​

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页