关于FTP和SFTP的操作总结

SFTP使用的三方类库是Renci.SshNet.DLL

SFTP连接大部分网上使用IP地址形式的路径,而我本次使用的是网站形式的。类似sftp.XXX.com

SFTP的操作也类似File文件的操作,网上大部分都是写一个Helper类,创建对象,调用方法,但是直接操作也是直接了当的,本次操作总结就直接写方法,不写Helper类。

1.连接SFTP

根据网上很多的操作 使用Host即IP地址,Port端口号,账号密码即可成功。

 而我本次在实践中,用此方法,一直提示无法找到这样的主机。

最终使用它的另一个重载方法

只提供host,账号密码便可以成功连接。

代码如下:

<add key="sFTPPath" value="sftp.XXX.com" />
<add key="sFTPUserName" value="XXXXXX" />
 <add key="sFTPPwd" value="XXXXXXXX" />
App.config
SftpClient client = new SftpClient(ConfigurationManager.AppSettings["sFTPPath"], ConfigurationManager.AppSettings["sFTPUserName"], ConfigurationManager.AppSettings["sFTPPwd"]);//使用Clinet方法中的HOST NAME PASSWORD方法
 client.Connect();//连接Client
bool connected = client.IsConnected;//判断是否连接成功
Sftp连接创建

 2.连接SFTP中的操作

2.1 SFTP 上传文件,使用UpoladFile方法,对象都是我们一开始创建的Clinet

代码如下:

 <add key="sFTPFolder" value="//XXXXX"/>
APP.config
 FileStream fs = File.OpenRead(本地文件);//把文件写成流
                                string uploadName = ConfigurationManager.AppSettings["sFTPFolder"] + @"/" + name+ ".jgp";//上传的文件地址使用的是相对路径文件 如//XXX/651.JPG
                                client.UploadFile(fs, uploadName);//上传文件
                                fs.Close();//关闭流 停止占用文件进程
UploadFile

2.2 SFTP 下载操作 使用DownloadFile方法

 

 代码如下:

 <add key="sFTPFolder" value="//XXXXXXX"/>
App.config
string localpath = Path + @"" + name + ".jgp";//localpath是个完整的路径包含文件名
FileStream fs = File.OpenWrite(localpath);  
//把文件写成流             
client.DownloadFile(ConfigurationManager.AppSettings["sFTPFolder"] + @"/" + name + ".jpg", fs);//SFTP上的文件也是相对路径加文件名
fs.Close();
DownloadFile

2.3 类似还有获取SFTP文件列表名(返回List),还有SFTP内移动文件等等 可以自己查看操作。

   path如 //XXXX/

 

 PS:操作本地文件时地址都是精确到文件名格式 如:‪F:\XXX\XXXXXX.jpg

         操作SFTP上的路径都是相对地址   如://XXXX/XXXX.jpg

         操作文件都是精确到文件名的地址

 FTP 则提供一个上传方法

 public static void FtpSendFile(string filepath, string path, string ftpip, string username, string password)
        {

            try
            {
                FileInfo fileInf = new FileInfo(filepath);
                string uri = path + fileInf.Name;
                FtpWebRequest reqFTP;
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                reqFTP.Credentials = new NetworkCredential(username, password);
                reqFTP.KeepAlive = false;
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                reqFTP.UseBinary = true;
                reqFTP.ContentLength = fileInf.Length;
                reqFTP.Proxy = new WebProxy();
                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;
                FileStream fs = fileInf.OpenRead();
                Stream strm = reqFTP.GetRequestStream();
                contentLen = fs.Read(buff, 0, buffLength);
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, contentLen);
                    contentLen = fs.Read(buff, 0, buffLength);
                }
                strm.Close();
                fs.Close();
            }
            catch (Exception ex)
            {
                //LogHelper.WriteLog(ex.Message.ToString(), ex);
            }

        }
FtpSendFile

filepath具体文件名地址,path:ftp://XX.XX.XX.XX//XXXXX//  (上传到XXXX文件夹下)  ip:XXX.XXX.XX.XXX 后面两个参数是账号密码

原文地址:https://www.cnblogs.com/cdjbolg/p/11834653.html