/// <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的路径是错误的