Ну, во-первых, вы в основном игнорируете значение, возвращаемое Read
- вы звоните al.AddRange(RecvBytes)
, как если бы оно было заполнено действительными данными - чего вполне может не быть.
Существует гораздо более простой способ чтения байтового массива из потока - используйте MemoryStream
. Например:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
(Кстати, вы используете .NET 1.1? Если так, то действительно стоит избегать неуниверсальных коллекций ...)
Я заметил, что вы также не закрываете поток - плохая идея. Используйте оператор using
, чтобы закрыть поток, например, так (имена изменились, чтобы быть более .NET идиоматическими тоже):
public byte[] SendPassiveFTPcmd(string cmd)
{
using (Stream passiveConnection = CreatePassiveConnections())
{
byte[] commandData = Encoding.ASCII.GetBytes(cmd);
NetStrm.Write(commandData, 0, commandData.Length);
tbStatus.Text += "\r\nSent:" + cmd;
byte[] data = ReadFully(passiveConnection);
StreamReader commandStream = new StreamReader(NetStrm);
tbStatus.Text += "\r\nRcvd:" + commandStream.ReadLine(); // 125
tbStatus.Text += "\r\nRcvd:" + commandStream.ReadLine(); // 226
return data;
}
}
Также обратите внимание, что вы каждый раз создаете новый StreamReader из NetStrm. Вероятно, это плохая идея - я бы создал один StreamReader и один StreamWriter, оба обертывающие NetStrm, и тогда вам вообще не нужно иметь дело с двоичными данными. В противном случае новые StreamReaders могут считывать больше данных, чем запрашиваемые вами строки, в результате чего в следующий раз вы пропустите данные.