FTP移动文件

在开发项目的时候,需要移动FTP上的文件。网上找到MoveTo方法,并没有实际效果。踩了坑,网上找了很久也没有效果。那是因为我们的文件来源路径和模板路径不正确,需要转为相对路径才能使用。Uri.MakeRelativeUri方法生成一个文件相对路径,代码如下:

/// <summary>
        /// ftp服务器移动文件
        /// </summary>
        /// <param name="url">文件夹路径</param>
        /// <param name="fileName">文件名称</param>
        /// <param name="backupUrl">备份路径</param>
        /// <param name="newFileName"></param>
        public bool MoveFtpFile(string url, string fileName, string backupUrl, string newFileName)
        {
            //登入到ftp的账号
            string ftpUserName = att.ftpUserName;
            //登入到ftp的密码
            string ftpUserPwd = att.ftpUserPwd;
            bool success = false;
            var uri = url + backupUrl;
            if (!Directory.Exists(uri))
            {
                FtpWebRequest frequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
                frequest.Credentials = new NetworkCredential(att.ftpUserName, att.ftpUserPwd);
                frequest.Method = WebRequestMethods.Ftp.MakeDirectory;
                try
                {
                    FtpWebResponse response = frequest.GetResponse() as FtpWebResponse;
                }
                catch { }
            }

            //重命名或移动文件
            var sourceUrl = url + "/" + fileName;//文件源路径
            var destinationUrl = uri + "/" + newFileName;//目标路径,文件名:yyyyMMddHHmmss_fileName
            FtpWebRequest reqFTP;
            try
            {
                var uriSource = new Uri(sourceUrl, UriKind.Absolute);
                var uriDestination = new Uri(destinationUrl, UriKind.Absolute);
                Uri targetUriRelative = uriSource.MakeRelativeUri(uriDestination);

                reqFTP = (FtpWebRequest)FtpWebRequest.Create(uriSource.AbsoluteUri);
                reqFTP.Method = WebRequestMethods.Ftp.Rename;
                reqFTP.RenameTo = Uri.UnescapeDataString(targetUriRelative.OriginalString);
                reqFTP.KeepAlive = false;
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(att.ftpUserName, att.ftpUserPwd);
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                ftpStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {

            }
            return success;
        }

如有问题请指出,大家共同学习。


版权声明:本文为zhangxin988原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。