当前位置: 代码迷 >> C# >> 求解答!C# FTP上传文件到服务器端重命名时失败 550异常
  详细解决方案

求解答!C# FTP上传文件到服务器端重命名时失败 550异常

热度:96   发布时间:2016-05-05 02:59:05.0
求解答!!!C# FTP上传文件到服务器端重命名时失败 550错误
  /// <summary>
        /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
        /// </summary>
        /// <param name="strOldFileName">旧文件名</param>
        /// <param name="strNewFileName">新文件名</param>
        public void Rename(string strOldFileName, string strNewFileName)
        {
            if (!bConnected)
            {
                Connect();
            }
            SendCommand("RNFR " + strOldFileName);
            if (iReplyCode != 350)
            {
                throw new IOException(strReply.Substring(4));
            }
            //  如果新文件名与原有文件重名,将覆盖原有文件
            SendCommand("RNTO " + strNewFileName);
            if (iReplyCode != 250)  //该句报错 返回值都是550 所以抛出异常
            {
                throw new IOException(strReply.Substring(4));
            }
        }




 private void SendCommand(String strCommand)
        {
            Byte[] cmdBytes =
            Encoding.Default.GetBytes((strCommand + "\r\n").ToCharArray());
            socketControl.Send(cmdBytes, cmdBytes.Length, 0);
            ReadReply();
        }


/// <summary>
        /// 读取Socket返回的所有字符串
        /// </summary>
        /// <returns>包含应答码的字符串行</returns>
        private string ReadLine()
        {
            while (true)
            {
                int iBytes = socketControl.Receive(buffer, buffer.Length, 0);
                strMsg += ASCII.GetString(buffer, 0, iBytes);
                if (iBytes < buffer.Length)
                {
                    break;
                }
            }
            char[] seperator = { '\n' };
            string[] mess = strMsg.Split(seperator);
            if (strMsg.Length > 2)
            {
                strMsg = mess[mess.Length - 2];
                //seperator[0]是10,换行符是由13和0组成的,分隔后10后面虽没有字符串,
                
            }
            else
            {
                strMsg = mess[0];
            }
            if (!strMsg.Substring(3, 1).Equals(" "))//返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
            {
                return ReadLine();
            }
            return strMsg;
        }
------解决思路----------------------
不知道你这iReplyCode怎么来的
一般ftp报错还会有个更详细的错误信息
------解决思路----------------------
是不是权限问题?
------解决思路----------------------
strReply = ReadLine();
iReplyCode = Int32.Parse(strReply.Substring(0, 3));

throw new IOException(strReply.Substring(4));

strReply 里到底是什么?
------解决思路----------------------
又看了下,你不要在ReadLine里做什么Split,把所有收到的内容都记录下来看,里面有详细的出错原因
比如权限不够返回的差不多是这样的

550-Access is denied. 
 Win32 error:   Access is denied. 
 Error details: File system denied the access.
550 End
------解决思路----------------------
这不是很显然了吗,你RNFR或者RNTO的路径是错误的
  相关解决方案