2010-02-23 2 views
8

Я реализовал возможность загрузки, скачивания, удаления и т. Д., Используя класс FtpWebRequest в C#. Это довольно прямолинейно.Как отправить произвольные команды FTP в C#

Что мне нужно сделать сейчас, это поддержка отправки произвольных команд FTP, такие как

quote SITE LRECL=132 RECFM=FB 
or 
quote SYST 

Вот пример конфигурации прямо от наших app.config:

<!-- The following commands will be executed before any uploads occur --> 
<extraCommands> 
    <command>quote SITE LRECL=132 RECFM=FB</command> 
</extraCommands> 

Я до сих пор исследования, как это сделать используя FtpWebRequest. Вероятно, я попробую следующий класс WebClient. Кто-нибудь может указать мне в правильном направлении быстрее? Благодаря!

ОБНОВЛЕНИЕ: Я пришел к такому же выводу, что и .NET Framework 3.5. FtpWebRequest ничего не поддерживает, кроме того, что находится в WebRequestMethods.Ftp.*. Я попробую стороннее приложение, рекомендованное некоторыми другими сообщениями. Спасибо за помощь!

+0

ли Вы, попробуйте Rebex FTP с этими командами? это хорошо работает? – Askolein

ответ

9

Я не думаю, что это может быть сделано с FtpWebRequest ... Единственный способ определить команду FTP осуществляется через Method собственности, а также в документации говорится:

Обратите внимание, что строки, определенные в WebRequestMethods.Ftp - это единственные поддерживаемые опции для свойства Method. При установке свойства Method на любое другое значение будет выведено исключение ArgumentException.

SITE и СИС не входят в число предопределенных вариантов, так что я предполагаю, что вы застряли ...

Не тратьте время, чтобы попробовать WebClient класс, это даст вам еще меньшую гибкость, чем FtpWebRequest ,

Однако, есть много сторонних реализации FTP, с открытым исходным кодом или коммерческих, и я уверен, что некоторые из них могут обрабатывать пользовательские команды ...

3

Вы можете попробовать наш Rebex FTP component:

// create client and connect 
Ftp client = new Ftp(); 
client.Connect("ftp.example.org"); 
client.Login("username", "password"); 

// send SITE command 
// note that QUOTE and SITE are ommited. QUOTE is command line ftp syntax only. 
client.Site("LRECL=132 RECFM=FB"); 

// send SYST command 
client.SendCommand("SYST"); 
FtpResponse response = client.ReadResponse(); 
if (response.Group != 2) 
    ; // handle error 

// disconnect 
client.Disconnect(); 
-5

Использование sendCommand("SITE LRECL=242 BLKSIZE=0 RECFM=FB");

+3

Это очень бесполезно, потому что информация не предоставляется. Что такое «sendCommand» - это сторонняя библиотека, имеет ли она какое-то отношение к FtpWebRequest ??? –

6

FtpWebRequest не поможет, как Thomas Levesque сказал в своем answer. Вы можете использовать некоторые решения сторонних разработчиков или следующие упрощенные TcpClient на основе кода, который я переработан от answer written in Visual Basic:

public static void SendFtpCommand() 
{ 
    var serverName = "[FTP_SERVER_NAME]"; 
    var port = 21; 
    var userName = "[FTP_USER_NAME]"; 
    var password = "[FTP_PASSWORD]" 
    var command = "SITE CHMOD 755 [FTP_FILE_PATH]"; 

    var tcpClient = new TcpClient(); 
    try 
    { 
     tcpClient.Connect(serverName, port); 
     Flush(tcpClient); 

     var response = TransmitCommand(tcpClient, "user " + userName); 
     if (response.IndexOf("331", StringComparison.OrdinalIgnoreCase) < 0) 
      throw new Exception(string.Format("Error \"{0}\" while sending user name \"{1}\".", response, userName)); 

     response = TransmitCommand(tcpClient, "pass " + password); 
     if (response.IndexOf("230", StringComparison.OrdinalIgnoreCase) < 0) 
      throw new Exception(string.Format("Error \"{0}\" while sending password.", response)); 

     response = TransmitCommand(tcpClient, command); 
     if (response.IndexOf("200", StringComparison.OrdinalIgnoreCase) < 0) 
      throw new Exception(string.Format("Error \"{0}\" while sending command \"{1}\".", response, command)); 
    } 
    finally 
    { 
     if (tcpClient.Connected) 
      tcpClient.Close(); 
    } 
} 

private static string TransmitCommand(TcpClient tcpClient, string cmd) 
{ 
    var networkStream = tcpClient.GetStream(); 
    if (!networkStream.CanWrite || !networkStream.CanRead) 
     return string.Empty; 

    var sendBytes = Encoding.ASCII.GetBytes(cmd + "\r\n"); 
    networkStream.Write(sendBytes, 0, sendBytes.Length); 

    var streamReader = new StreamReader(networkStream); 
    return streamReader.ReadLine(); 
} 

private static string Flush(TcpClient tcpClient) 
{ 
    try 
    { 
     var networkStream = tcpClient.GetStream(); 
     if (!networkStream.CanWrite || !networkStream.CanRead) 
      return string.Empty; 

     var receiveBytes = new byte[tcpClient.ReceiveBufferSize]; 
     networkStream.ReadTimeout = 10000; 
     networkStream.Read(receiveBytes, 0, tcpClient.ReceiveBufferSize); 

     return Encoding.ASCII.GetString(receiveBytes); 
    } 
    catch 
    { 
     // Ignore all irrelevant exceptions 
    } 

    return string.Empty; 
} 

Вы можете ожидать следующий поток при получении через FTP:

220 (vsFTPd 2.2.2) 
user [FTP_USER_NAME] 
331 Please specify the password. 
pass [FTP_PASSWORD] 
230 Login successful. 
SITE CHMOD 755 [FTP_FILE_PATH] 
200 SITE CHMOD command ok. 
Смежные вопросы