2010-02-23 16 views
8

Zaimplementowałem możliwość przesyłania, pobierania, usuwania itp. Przy użyciu klasy FtpWebRequest w języku C#. To dość proste.Jak wysyłać dowolne polecenia FTP w języku C#

Co muszę zrobić teraz jest wsparcie wysyłanie dowolnych poleceń FTP, takie jak

quote SITE LRECL=132 RECFM=FB 
or 
quote SYST 

Tutaj jest przykład konfiguracji prosto z naszej app.config:

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

ja wciąż bada, jak to zrobić przy użyciu FtpWebRequest. Najprawdopodobniej spróbuję następnej klasy: WebClient. Czy ktoś może szybciej wskazać mi właściwy kierunek? Dzięki!

AKTUALIZACJA: Doszedłem do tego samego wniosku, ponieważ .NET Framework 3.5 FtpWebRequest nie obsługuje niczego oprócz tego, co jest w WebRequestMethods.Ftp.*. Spróbuję aplikacji innej firmy zalecanej przez niektóre inne posty. Dzięki za pomoc!

+0

skończyłeś spróbuj Rebex FTP z tymi poleceniami? czy to działa dobrze? – Askolein

Odpowiedz

9

Nie sądzę, można to zrobić z FtpWebRequest ... Jedynym sposobem, aby określić polecenie FTP jest za pośrednictwem właściwości Method i stany dokumentacja:

Należy zauważyć, że łańcuchy zdefiniowane w WebRequestMethods.Ftp klasy są jedynymi obsługiwanymi opcjami dla właściwości Method. Ustawienie właściwości na inną wartość spowoduje wyjątek od .

SITE i SYST nie należą do predefiniowanych opcji, więc myślę, że utkniesz ...

Nie trać czasu, aby spróbować klasę WebClient, to daje jeszcze mniej elastyczna niż FtpWebRequest .

Jednakże, istnieje wiele implementacji FTP firm, open source lub handlowego, a jestem całkiem pewien, że niektórzy z nich może obsługiwać zwyczaj nakazuje ...

3

Można Zajrzyj 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

Zastosowanie sendCommand("SITE LRECL=242 BLKSIZE=0 RECFM=FB");

+3

Jest to bardzo pomocne, ponieważ nie podano żadnych informacji. Czym jest "sendCommand", czy jest to biblioteka innej firmy, czy ma coś wspólnego z FtpWebRequest ??? –

6

FtpWebRequest nie pomoże jak Thomas Levesque powiedział w swoim answer. Można korzystać z niektórych rozwiązań firm trzecich lub kolejny, uproszczone TcpClient kod na podstawie którego mam refactored z 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; 
} 

można oczekiwać następującego przepływ przy pobieraniu przez 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. 
Powiązane problemy