Получение списка файлов с FTP-сервера в C # - PullRequest
1 голос
/ 13 ноября 2009

Я пытаюсь получить список файлов с FTP-сервера, но я получаю некоторые странные ответы не ASCII

Вот код, который я использую:

 public string[] getFileList(string mask)
 {
   if(!logined)
   {
     login();
   }
   Socket cSocket = createDataSocket();
   this.getSslDataStream(cSocket);
   sendCommand("PASV");
   sendCommand("LIST " + "*"+mask);
   stream2.AuthenticateAsClient(remoteHost,
      null,
      System.Security.Authentication.SslProtocols.Ssl3 |
      System.Security.Authentication.SslProtocols.Tls,
      true);
   if(!(retValue == 150 || retValue == 125))
   {
     throw new IOException(reply.Substring(4));
   }
   StringBuilder mes = new StringBuilder();       
   while(true)
   {
     int bytes = cSocket.Receive(buffer, buffer.Length, 0);
     mes.Append(ASCII.GetString(buffer, 0, bytes));
     if(bytes < buffer.Length)
     {
       break;
     }
   }
   string[] seperator = {"\r\n"};
   string[] mess = mes.ToString().Split(seperator, StringSplitOptions.RemoveEmptyEntries);
   cSocket.Close();
   readReply();
   if(retValue != 226)
   {
     throw new IOException(reply.Substring(4));
   }
   return mess;
 }

Ответ, который я получаю от FTP-сервера, таков:

WRITE:PASV

READ:227 Entering Passive Mode (10,0,2,24,5,119)`

WRITE:LIST *.dat

READ:150 Opening ASCII mode data connection for /bin/ls.

READ:226 Transfer complete.

Это останавливается там. Массив строк, который он возвращает, содержит один индекс с некоторыми не-ascii символами. Похоже на кучу мусора. Возможно, моя ASCII.GetString часть неверна? Я не совсем уверен.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 16 ноября 2009

Я написал довольно простую в использовании библиотеку-обертку для всего материала FtpWebRequest. Если вы хотите проверить это, это здесь https://gist.github.com/1242616

Я использую его во многих производственных средах, и он еще не подвел меня.

4 голосов
/ 13 ноября 2009

Что бы это ни стоило, пространство имен System.Net имеет классы FtpWebRequest и FtpWebResponse , начиная с .Net 2.0.

Вот некоторый код, который я использовал для записи файлов сервера в локальный файл:

...
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(address);
ftpRequest.Credentials = new NetworkCredential(username, password);
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
ftpRequest.KeepAlive = false;

FtpWebResponse ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();

sr = new StreamReader(ftpResponse.GetResponseStream());
sw = new StreamWriter(new FileStream(fileName, FileMode.Create));

sw.WriteLine(sr.ReadToEnd());
sw.Close();

ftpResponse.Close();
sr.Close();
...
0 голосов
/ 25 августа 2015
public Socket BuildDataConn(Socket FirstSocket)
{
    string ret = "";
    string RemoteIP = "";
    int RemotePort = 0;
    SendCommand("PASV");

    int id = 0;
    id = strMsg.LastIndexOf(')');
    if (id != 0) 
    {
        string tmp = strMsg.Substring(strMsg.LastIndexOf('(') + 1, id - strMsg.LastIndexOf('(') - 1);
        string[] bByte = tmp.Split(',');
        RemotePort = int.Parse(bByte[4]) * 256 + Byte.Parse(bByte[5]);
        RemoteIP = bByte[0]+"." + bByte[1] + "." + bByte[2] + "." + bByte[3];
    }
    Socket NewConn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    IPEndPoint RemoteIPPort = new IPEndPoint(IPAddress.Parse(RemoteIP), RemotePort);
    try
    {
        NewConn.Connect(RemoteIPPort);
    }
    catch
    {
        throw new IOException("unable to Connect  !");
    }
    return NewConn;
}

Вместо использования cSocket для получения данных ответа необходимо получить второй сокет, а затем использовать сокет для получения данных ответа. второй сокет будет отвечать за отправку информации обратно. И убедитесь, что вы изменили свой рабочий каталог FTP перед отправкой команды LIST.

public List<string> GetFileNames()
{
    if (!bConnected)
    {
        Open();
    }
    List<string> retObj = new List<string>();
    Socket dataSock =  BuildDataConn(mySocket);

    SendCommand("NLST");
    string dataSockMsg = "";
    buffer = new byte[BLOCK_SIZE];

    while (true)
    {
        int iBytes = dataSock.Receive(buffer, buffer.Length, 0);
        dataSockMsg += System.Text.Encoding.ASCII.GetString(buffer, 0, iBytes);
        if (iBytes < buffer.Length)
        {
            break;
        }
    }

    string[] message = dataSockMsg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);     

    dataSock.Close();

    foreach (string obj in message)
    {
        retObj.Add(obj);
    }

    return retObj;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...