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;//吧文件夹名字显示 }