本例演示如何运用 C# 中的 FtpWebRequest 等对象从 FTP 服务器上获取文件,并结合 Stream 对象中的方法来保存下载的文件:
using System;
using System.IO;
using System.Net; namespace ConsoleApp
{
class Program
{
static void Main()
{
FtpWebRequest reqFtp = null;
FtpWebResponse responseFtp = null;
Stream stream = null; //ftp服务器信息
string ftpFilePath = "ftp://200.16.220.100/test.xls";
string ftpAccount = "sa";
string ftpPassword = "psd123";
string localFilePath = @"d:\test.xls"; try
{
//初始化FtpWebRequest对象
reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(ftpFilePath));
reqFtp.Timeout = * * ;
reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
reqFtp.UseBinary = true;
reqFtp.UsePassive = true;
reqFtp.EnableSsl = false;
reqFtp.Credentials = new NetworkCredential(ftpAccount, ftpPassword);
responseFtp = (FtpWebResponse)reqFtp.GetResponse();
stream = responseFtp.GetResponseStream(); //保存文件到本地磁盘
SaveFile(localFilePath, stream);
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
} /// <summary>
/// 把文件流中的数据写入到文件中
/// </summary>
/// <param name="fileFullPath">文件的绝对路径</param>
/// <param name="inputStream">文件流</param>
public static void SaveFile(string fileFullPath, Stream inputStream)
{
using (FileStream fileStream = new FileStream(fileFullPath, FileMode.OpenOrCreate, FileAccess.Write))
{
using (BufferedStream buffStream = new BufferedStream(inputStream))
{
int buffSize = ;
byte[] buff = new byte[buffSize]; //将字节从当前缓冲流读取到数组
int readCount = ;
readCount = buffStream.Read(buff, , buffSize); while (readCount > )
{
//将字节块写入文件流
fileStream.Write(buff, , readCount);
//由于读到流的最后一段时,流会自动关闭
//这里需要判断流是否可读,
//若不可读,说明读完了最后一段,可以结束
if (buffStream.CanRead)
{
readCount = buffStream.Read(buff, , buffSize);
}
else
{
readCount = ;
break;
}
}
} //清除此流的缓冲区,使得所有缓冲的数据都写入到文件中
fileStream.Flush();
//关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)
fileStream.Close();
}
}
}
}
下面的方法用于判断文件目录是否存在,如果不存在就新建目录:
private static Boolean FtpMakeDir(string ftpServerIP, string ftpUserID, string ftpPassword, string localFile)
{
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri("ftp://" + ftpServerIP + localFile));
req.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
req.Method = WebRequestMethods.Ftp.MakeDirectory;
try
{
FtpWebResponse response = (FtpWebResponse)req.GetResponse();
response.Close();
}
catch (Exception ex)
{
req.Abort();
return false;
}
finally
{
req.Abort();
}
return true;
}
参考资源:
https://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest(v=vs.110).aspx