2010-02-23 26 views
8

Tôi đã triển khai khả năng tải lên, tải xuống, xóa, v.v. bằng cách sử dụng lớp FtpWebRequest trong C#. Đó là khá thẳng về phía trước.Cách gửi các lệnh FTP tùy ý trong C#

Những gì tôi cần làm bây giờ là hỗ trợ gửi các lệnh FTP tùy ý như

quote SITE LRECL=132 RECFM=FB 
or 
quote SYST 

Dưới đây là một cấu hình ví dụ trực tiếp từ app.config của chúng tôi:

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

tôi vẫn đang nghiên cứu làm thế nào để làm điều này sử dụng FtpWebRequest. Có lẽ tôi sẽ thử lớp học WebClient tiếp theo. Bất cứ ai cũng có thể chỉ cho tôi đi đúng hướng nhanh hơn? Cảm ơn!

CẬP NHẬT: Tôi đã đi đến cùng một kết luận, như của .NET Framework 3.5 FtpWebRequest không hỗ trợ bất kỳ điều gì ngoại trừ những gì trong WebRequestMethods.Ftp.*. Tôi sẽ thử một ứng dụng của bên thứ ba được đề xuất bởi một số bài đăng khác. Cảm ơn đã giúp đỡ!

+0

Bạn có thử Rebex FTP với các lệnh này? nó có hoạt động tốt không? – Askolein

Trả lời

9

Tôi không nghĩ rằng nó có thể được thực hiện với FtpWebRequest ... Cách duy nhất để xác định một lệnh FTP là thông qua việc Method bất động sản, và các trạng thái tài liệu:

Lưu ý rằng các chuỗi được định nghĩa trong Lớp WebRequestMethods.Ftp là các tùy chọn được hỗ trợ duy nhất cho thuộc tính Method. Việc đặt thuộc tính Method thành bất kỳ giá trị nào khác sẽ dẫn đến một ngoại lệ ArgumentException.

SITE và SYST không nằm trong số các tùy chọn được xác định trước, vì vậy tôi đoán bạn đang bị mắc kẹt ...

Đừng lãng phí thời gian để thử các lớp WebClient, nó sẽ cung cấp cho bạn sự linh hoạt thậm chí còn ít hơn FtpWebRequest .

Tuy nhiên, có rất nhiều bên thứ ba thực hiện FTP, mã nguồn mở hoặc thương mại, và tôi chắc rằng một số trong số họ có thể xử lý các lệnh tùy chỉnh ...

3

Bạn có thể thử chúng tôi 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

Sử dụng sendCommand("SITE LRECL=242 BLKSIZE=0 RECFM=FB");

+3

Điều này rất vô ích vì không có thông tin nào được cung cấp. "SendCommand" là gì nó là thư viện của bên thứ 3, nó có liên quan gì đến FtpWebRequest ??? –

6

Các FtpWebRequest sẽ không giúp bạn như Thomas Levesque đã nói trong answer mình. Bạn có thể sử dụng một số giải pháp của bên thứ ba hoặc những điều sau đây, đơn giản hóa TcpClient dựa trên mã mà tôi đã refactored từ một 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; 
} 

Bạn có thể mong đợi dòng chảy sau khi nhận được thông qua 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. 
Các vấn đề liên quan