FtpWebRequest错误:550 ASCII模式下不允许使用大小

时间:2014-12-22 00:30:23

标签: c# ftp binary ascii ftpwebrequest

我试图通过匿名FTP从远程FTP文件中获取文件大小。

public static long GetSize(string ftpPath)
{
    try
    {
        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath));
        request.Proxy = null;
        request.Credentials = new NetworkCredential("anonymous", "´");
        request.UseBinary = true;
        request.Method = WebRequestMethods.Ftp.GetFileSize;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        long size = response.ContentLength;
        response.Close();
        return size;
    }
    catch (WebException e)
    {
        string status = ((FtpWebResponse)e.Response).StatusDescription;
        MessageBox.Show(status);
        return 0;
    }
}

这当前返回错误" 550 ASCII模式下不允许的大小。"我知道我必须使用二进制模式,但将UseBinary设置为true(参见上文)并不能解决问题。

1 个答案:

答案 0 :(得分:1)

不幸的是,我认为你可能会陷入困境。每WebRequestMethods.Ftprequest.UseBinary = true类不支持发送除受支持的FTP命令以外的FTP命令 - 对于您的用例,您需要您的客户端发送" TYPE I" (对于"图像"或二进制模式),在发送SIZE命令之前。

或者,作为一种hacky解决方法,您可以在发送SIZE命令之前尝试下载文件 - 任何文件。使用GetFileSize 请求时,它应该会导致您的客户端发送" TYPE I"命令到FTP服务器。 (如果下载请求失败,则无关紧要; TYPE命令仍然会被发送。)大多数FTP服务器在收到TYPE命令后,假设该TYPE用于后续命令。然后,当您再次尝试Localized.strings请求时,FTP服务器可能处于二进制,而不是ASCII模式,并且您的SIZE命令可能会成功。