【C#】一个可以上传整个目录的FTPClient类
这是一个比较通用的FTPClient类,提供登陆FTP、上传/删除文件以及创建/删除目录等FTP操作方法。
类文件:/Files/youuuu/cs/FtpClient.rar
方法调用:
//实例化FTPClient
//传参1:FTP主机地址
//传参2:@"/"为FTP根目录,如要登陆子目录则为@"/你的子目录/",注意FTP目录不能有中文或特殊字符
//传参3:FTP用户登陆名
//传参4:FTP登陆密码
//传参5:FTP端口21
FTPClient.FTPClient ftp = new FTPClient.FTPClient("10.196.59.135", @"/", "administrator", "123456", "21");
//创建目录,注意FTP目录不能有中文或特殊字符
ftp.MkDir(@"/你的子目录");
//放置单个目录下的所有文件(不包括该目录下子目录里的文件),注意FTP目录不能有中文或特殊字符
ftp.Put("你的本地目录", "*");
//传参1:FTP主机地址
//传参2:@"/"为FTP根目录,如要登陆子目录则为@"/你的子目录/",注意FTP目录不能有中文或特殊字符
//传参3:FTP用户登陆名
//传参4:FTP登陆密码
//传参5:FTP端口21
FTPClient.FTPClient ftp = new FTPClient.FTPClient("10.196.59.135", @"/", "administrator", "123456", "21");
//创建目录,注意FTP目录不能有中文或特殊字符
ftp.MkDir(@"/你的子目录");
//放置单个目录下的所有文件(不包括该目录下子目录里的文件),注意FTP目录不能有中文或特殊字符
ftp.Put("你的本地目录", "*");
此外除了这些较常用的方法之外,我这里还加了一个遍历整个本地目录包括子目录下的所有文件然后上传到FTP的方法如下:
/// <summary>
/// 将整个文件夹的内容完全上传
/// </summary>
/// <param name="strFolder">本地目录(不得以\结束)</param>
/// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
public void PutItAll(string strFolder,
string host,
string path,
string user,
string pass,
int port,
string rootPath,
String childFolder)
{
try
{
FTPClient ftp = new FTPClient(host, path, user, pass, port);
ftp.Put(strFolder, "*");
string[] directories = Directory.GetDirectories(strFolder);
foreach (string dir in directories)
{
if (ftp==null)
{
ftp = new FTPClient(host, path, user, pass, port);
ftp.Put(strFolder, "*");
}
string parent = Directory.GetParent(dir).ToString()+@"\" ;
string kidds = dir.Substring(dir.IndexOf(parent) + parent.Length) + "/";
parent = parent.Replace(rootPath, "/");
parent = parent.Replace(@"\", "/");
parent = @"/"+childFolder+parent;
try
{
ftp.MkDir(kidds);
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.Print(ex.Message.ToString());
}
ftp.DisConnect();
ftp = null;
//递归
PutItAll(dir, host, parent+kidds, user, pass, port, rootPath,childFolder);
}
}
catch (IOException ex)
{
throw ex;
}
}
/// 将整个文件夹的内容完全上传
/// </summary>
/// <param name="strFolder">本地目录(不得以\结束)</param>
/// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
public void PutItAll(string strFolder,
string host,
string path,
string user,
string pass,
int port,
string rootPath,
String childFolder)
{
try
{
FTPClient ftp = new FTPClient(host, path, user, pass, port);
ftp.Put(strFolder, "*");
string[] directories = Directory.GetDirectories(strFolder);
foreach (string dir in directories)
{
if (ftp==null)
{
ftp = new FTPClient(host, path, user, pass, port);
ftp.Put(strFolder, "*");
}
string parent = Directory.GetParent(dir).ToString()+@"\" ;
string kidds = dir.Substring(dir.IndexOf(parent) + parent.Length) + "/";
parent = parent.Replace(rootPath, "/");
parent = parent.Replace(@"\", "/");
parent = @"/"+childFolder+parent;
try
{
ftp.MkDir(kidds);
}
catch (System.Exception ex)
{
System.Diagnostics.Debug.Print(ex.Message.ToString());
}
ftp.DisConnect();
ftp = null;
//递归
PutItAll(dir, host, parent+kidds, user, pass, port, rootPath,childFolder);
}
}
catch (IOException ex)
{
throw ex;
}
}
除了目录整体上传之外,也可以添加一个ZIP压缩类,先把本地目录整体打包再上传FTP再在FTP服务端解压。这样做最快捷,不过首先服务端要支持解压。