В настоящее время я работаю над программой, которая передает файлы через FTP. Я отправляю файлы в двоичном формате, потому что с ASCII я не могу отправлять специальные символы.
Вот мой код:
using(BinaryReader bReader = new BinaryReader(srcStream))
using (BinaryWriter bWriter = new BinaryWriter(destStream))
{
Byte[] readBytes = new Byte[1024];
for(int i = 0; i < bReader.BaseStream.Length; i += 1024)
{
readBytes = bReader.ReadBytes(1024);
bWriter.Write(readBytes);
}
}
Мои проблемы с этим кодом:
Спасибо большое: D
Почему вы используете BinaryReader и BinaryWriter? Почему вы неоднократно спрашиваете о длине? Здесь метод, который я опубликовал несколько раз:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8192];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
Это использует буфер 8K, но вы можете это явно изменить. О, и он повторно использует буфер, а не создает новый массив байтов каждый раз, что и будет делать ваш код:) (Вам не нужно выделять массив байтов, чтобы начать с него - вы могли бы объявить readBytes
на точка вызова bReader.ReadBytes
.)
Я думаю, что ваши проблемы с производительностью исходят из двух мест. Вы вызываете bReader.BaseStream.Length
каждый раз через цикл, и ваш вызов bReader.ReadBytes()
каждый раз выделяет новый массив байтов.
Я также не думаю, что BinaryReader и BinaryWriter необходимы, поскольку вы не используете их функции для чтения и записи типов, отличных от байтовых массивов, которые уже поддерживаются в базовых потоках через Stream.Read()
и Stream.Write()
.
Я бы сделал это как:
byte [] buffer = new byte[1024];
int bytesRead;
while ( (bytesRead = srcStream.Read(buffer, 0, buffer.Length)) != 0 )
{
dstStream.Write(buffer, 0, bytesRead);
}