Converter MemoryStream para FileStream cria centenas de arquivos idênticos?
-
05-09-2019 - |
Pergunta
Eu estou acessando um httpwebrequest que retorna um arquivo PDF como a resposta. Estou lendo essa resposta em um fluxo de memória, e depois converter para um arquivo. O problema é, é que centenas de arquivos estão sendo criados. Não sei por que, eu tentei muitas maneiras, e todos fazem o mesmo ... Este é o primeiro método que retorna o memorystream.
MemoryStream memStream = new MemoryStream();
byte[] buffer = new byte[2048];
int bytesRead = 0;
do
{
bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
memStream.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
Segundo a se converter ao FileStream ...
byte[] data = stream.ToArray();
FileStream fs = new FileStream(newFile, FileMode.CreateNew);
fs.Write(data, 0, data.Length);
Todas as idéias?
Editar para adicionar mais código ...
public MemoryStream GetToStream()
{
if (_Req == null)
throw new Exception("HttpWebRequest is not initialised");
GetResult(_Req);
MemoryStream memStream = new MemoryStream();
byte[] buffer = new byte[2048];
int bytesRead = 0;
do
{
bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
memStream.Write(buffer, 0, bytesRead);
} while (bytesRead != 0);
_ResponseStream.Close();
if (memStream.Length > 0)
return memStream;
else return null;
}
newFile é o caminho mapeado para o servidor do arquivo para criar.
byte[] data = stream.ToArray();
FileStream fs = new FileStream(newFile, FileMode.Create);
fs.Write(data, 0, data.Length);
fs.Close();
Eu tentei stream.WriteTo (fs), e mesma coisa ocorre. Muito Bizzare.
Solução
Não é claro por que você deseja obter vários arquivos, mas você deve ser capaz de obter alguns informações com base nos nomes de arquivos - cada um corresponderia a um valor de newFile
Noto que você não está fechando seu fluxo de arquivo, pelo caminho. Usando File.WriteAllBytes
é uma maneira muito mais simples de alcançar seu objetivo, e não requer que você feche qualquer coisa:
byte[] data = stream.ToArray();
File.WriteAllBytes(newFile, data);
Uma alternativa é ainda usar um FileStream
(com uma declaração using
) mas o uso MemoryStream.WriteTo
para evitar a chamada para ToArray
que tem de copiar todos os dados:
using (FileStream fs = File.Create(newFile))
{
stream.WriteTo(fs);
}
Outras dicas
Gostaria de sugerir que você está recebendo mais pedidos de seu cliente do que você pensa. Verifique se o seu arquivo de log de acesso webserver. Os trechos de código que você está mostrando parece razoável, mas realmente não mostram suficiente do código para explicar o problema - você não está mostrando a parte direita do código. De qualquer forma, verifique o log de acesso ou usar algum tipo de rastreamento.