直接用地址下载,引用进度条:
/// <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;//吧文件夹名字显示
}