Как отправить произвольные команды FTP в C#
Я реализовал возможность загружать, скачивать, удалять и т. Д., Используя FtpWebRequest
класс в 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.*
, Я попробую стороннее приложение, рекомендованное некоторыми другими постами. Спасибо за помощь!
4 ответа
Я не думаю, что это может быть сделано с FtpWebRequest
... Единственный способ указать команду FTP через Method
собственность и документация гласят:
Обратите внимание, что строки, определенные в
WebRequestMethods.Ftp
класс являются единственными поддерживаемыми параметрами дляMethod
имущество. НастройкаMethod
свойство к любому другому значению приведет кArgumentException
исключение.
SITE и SYST не входят в число предопределенных опций, поэтому, я думаю, вы застряли...
Не тратьте время, чтобы попробовать WebClient
класс, это даст вам еще меньше гибкости, чем FtpWebRequest
,
Тем не менее, существует множество сторонних реализаций FTP, открытых или коммерческих, и я уверен, что некоторые из них могут обрабатывать пользовательские команды...
FtpWebRequest
не поможет вам, как сказал Thomas Levesque в своем ответе. Вы можете использовать некоторые сторонние решения или следующие упрощенные TcpClient
на основе кода, который я рефакторинг из ответа, написанного на 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.
Вы можете попробовать наш компонент Rebex FTP:
// 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();
Использование sendCommand("SITE LRECL=242 BLKSIZE=0 RECFM=FB");