public class FtpHelper
{
/// <summary>
///
/// </summary>
/// <param name="fileName">上传的文件名</param>
/// <param name="ftpServerIP"></param>
/// <param name="path"></param>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <param name="form">窗体</param>
/// <param name="pbarProcessUpload">进度条</param>
/// <returns></returns>
public static bool UploadFileByFtpWebRequest(string fileName, string ftpServerIP, string path, string userName, string password, System.Windows.Forms.Form form, System.Windows.Forms.ProgressBar pbarProcessUpload)
{
bool result = true;
string url = string.Format("ftp://{0}/{1}/{2}", ftpServerIP, path, fileName.Substring(fileName.LastIndexOf(@"\") + 1));
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential(userName, password);
request.Method = WebRequestMethods.Ftp.UploadFile;
Stream stream = request.GetRequestStream();
FileStream fileStream = new FileStream(fileName, FileMode.Open);
int packageSize = 1024 * 1024;
int packageCount = (int)(fileStream.Length / packageSize);
int rest = (int)(fileStream.Length % packageSize);
//控制进度条
form.BeginInvoke(new DoSomething(delegate()
{
pbarProcessUpload.Maximum = packageCount;
if (rest != 0) pbarProcessUpload.Maximum += 1;
}));
for (int index = 0; index < packageCount; index++)
{
byte[] buffer = new byte[packageSize];
fileStream.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, buffer.Length);
form.BeginInvoke(new DoSomething(delegate()
{
pbarProcessUpload.Value = index;
}));
}
if (rest != 0)
{
byte[] buffer = new byte[rest];
fileStream.Read(buffer, 0, buffer.Length);
stream.Write(buffer, 0, buffer.Length);
form.BeginInvoke(new DoSomething(delegate()
{
pbarProcessUpload.Value += 1;
}));
}
stream.Close();
fileStream.Close();
return result;
}
/// <summary>
/// 下载方法
/// </summary>
/// <param name="fileName">下载的文件名</param>
/// <param name="ftpServerIP"></param>
/// <param name="path"></param>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <param name="form">窗体</param>
/// <param name="pbarProcessDownload">进度条</param>
/// <param name="fileNameSaveAs">保存的文件名</param>
/// <returns></returns>
public static bool DownloadFileByFtpWebRequest(string fileName, string ftpServerIP, string path, string userName, string password, System.Windows.Forms.Form form, System.Windows.Forms.ProgressBar pbarProcessDownload, string fileNameSaveAs)
{
bool result = true;
string url = string.Format("ftp://{0}/{1}/{2}", ftpServerIP, path, fileName.Substring(fileName.LastIndexOf(@"\") + 1));
FtpWebRequest requsetOfLength = (FtpWebRequest)WebRequest.Create(url);
requsetOfLength.Credentials = new NetworkCredential(userName, password);
requsetOfLength.Method = WebRequestMethods.Ftp.GetFileSize;
long fileSize = requsetOfLength.GetResponse().ContentLength;
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
request.Credentials = new NetworkCredential(userName, password);
request.UseBinary = true;
request.KeepAlive = false;
request.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
FileStream fileStream = new FileStream(fileNameSaveAs, FileMode.Create);
int bufferSize = 2048;
int readCount;
int Maximum = (int)fileSize / bufferSize;
if (Maximum == 0) Maximum = 100;
byte[] buffer = new byte[bufferSize];
readCount = stream.Read(buffer, 0, bufferSize);
form.BeginInvoke(new DoSomething(delegate()
{
pbarProcessDownload.Maximum = Maximum;
}));
int index = 0;
while (readCount > 0)
{
fileStream.Write(buffer, 0, readCount);
readCount = stream.Read(buffer, 0, bufferSize);
form.BeginInvoke(new DoSomething(delegate()
{
if (index <= pbarProcessDownload.Maximum)
pbarProcessDownload.Value = index++;
}
));
}
stream.Close();
fileStream.Close();
response.Close();
form.BeginInvoke(new DoSomething(delegate()
{
pbarProcessDownload.Value = 0;
}));
return result;
}
private delegate void DoSomething();
}
测试窗体
代码:
public partial class FormFtpTest : Form
{
public FormFtpTest()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openDlg = new OpenFileDialog();
if (openDlg.ShowDialog() != DialogResult.OK) return;
string fileName = openDlg.FileName;
Thread thread = new Thread(new ThreadStart(delegate()
{
bool result = Common.FtpHelper.UploadFileByFtpWebRequest(fileName, "172.213.253.158", "\\", "wx", "123", this, pbarProcessUpload);
if (result) MessageBox.Show("ok");
else MessageBox.Show("error");
}));
thread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.FileName = textBox1.Text;
if (saveDlg.ShowDialog() != DialogResult.OK) return;
string fileName = saveDlg.FileName;
Thread thread = new Thread(new ThreadStart(delegate()
{
bool result = Common.FtpHelper.DownloadFileByFtpWebRequest(textBox1.Text, "172.123.213.51", "\\", "wx", "123", this, pbarProcessUpload, fileName);
if (result) MessageBox.Show("ok");
else MessageBox.Show("error");
}));
thread.Start();
}
}