定義FileStream類的操作類:操作類名: FtpUpDown
上傳文件
/// <summary>
/// 上傳文件
/// </summary>
/// <param name="localpath">上傳文件的全路徑 例@"D:\123.txt"</param>
/// <param name="ftppath"></param>
/// <returns></returns>
public bool Upload(string localpath, string ftppath)
{
bool bol = false;
try
{
FileInfo fileInf = new FileInfo(localpath);
//替換符號
ftppath = ftppath.Replace("\\", "/");
//組合ftp上傳文件路徑
string uri = "ftp://" + ftppath + "/" + fileInf.Name;
// 根據uri創建FtpWebRequest對象
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
// 指定數據傳輸類型
reqFTP.UseBinary = true;
// ftp用戶名和密碼
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
// 默認為true,連接不會被關閉
// 在一個命令之后被執行
reqFTP.KeepAlive = false;
// 指定執行什么命令
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
// 上傳文件時通知服務器文件的大小
reqFTP.ContentLength = fileInf.Length;
// 緩沖大小設置為kb
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
// 打開一個文件流(System.IO.FileStream) 去讀上傳的文件
FileStream fs = fileInf.OpenRead();
try
{
// 把上傳的文件寫入流
Stream strm = reqFTP.GetRequestStream();
// 每次讀文件流的kb
contentLen = fs.Read(buff, 0, buffLength);
// 流內容沒有結束
while (contentLen != 0)
{
// 把內容從file stream 寫入upload stream
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
bol = true;
}
// 關閉兩個流
strm.Close();
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show("上傳文件失敗,失敗原因;" + ex.Message);
}
}
catch (Exception ex)
{
MessageBox.Show("上傳文件失敗,失敗原因;" + ex.Message);
}
return bol;
}
下載文件:
/// <summary>
/// 下載文件
/// </summary>
/// <param name="localpath"></param>
/// <param name="fileName"></param>
/// <param name="errorinfo"></param>
/// <returns></returns>
public bool Download(string localpath, string fileName, out string errorinfo)
{
try
{
String onlyFileName = Path.GetFileName(fileName);
string newFileName = localpath + "\\" + onlyFileName;
if (File.Exists(newFileName))
{
errorinfo = string.Format("本地文件{0}已存在,無法下載", newFileName);
return false;
}
string url = "ftp://" + ftpServerIP + "/FileInfo/" + fileName;
// 根據uri創建FtpWebRequest對象
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
// 指定數據傳輸類型
reqFTP.UseBinary = true;
// ftp用戶名和密碼
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);
FileStream outputStream = new FileStream(newFileName, FileMode.Create, FileAccess.Write);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
errorinfo = "";
return true;
}
catch (Exception ex)
{
errorinfo = string.Format("因{0},無法下載", ex.Message);
return false;
}
}
調用方法:
/// <summary>
/// 上傳
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_1(object sender, RoutedEventArgs e)
{
FtpUpDown ftp = new FtpUpDown(ftpServerIP, ftpUserID, ftpPassword);
string localpath = @"D:\123.txt";
string ftppath = ftpServerIP + @"\FileInfo";
bool bol = ftp.Upload(localpath, ftppath);
if (bol == true)
MessageBox.Show("上傳成功");
else
MessageBox.Show("上傳失敗");
}
/// <summary>
/// 下載
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_2(object sender, RoutedEventArgs e)
{
string errorinfo;
string localpath = @"E:\qzq\FileInfo";
if (!Directory.Exists(localpath))
{
Directory.CreateDirectory(localpath);
}
string filename = "123.txt";
if (!File.Exists(localpath + "\\" + filename))
{
FtpUpDown ftp = new FtpUpDown(ftpServerIP, ftpUserID, ftpPassword);
bool bol = ftp.Download(localpath, filename, out errorinfo);
if (bol == true)
MessageBox.Show("下載成功");
else
MessageBox.Show("下載失敗:" + errorinfo + "");
}
else
{
MessageBox.Show("下載文件已存在!");
}
}
其中: ftpServerIP:上傳服務的IP地址。
ftpUserID: 上傳服務的登錄名。
ftpPassword: 上傳服務的密碼。