C#を使用してストリームをFileStreamに変換するための最良の方法は何ですか。
私が取り組んでいる関数には、アップロードされたデータを含むStreamが渡されており、FileStreamタイプのメソッドであるstream.Read()、stream.Seek()メソッドを実行できる必要があります。
単純なキャストは機能しないので、ここで助けを求めています。
Read
とSeek
は、Stream
だけでなく、FileStream
型のメソッドです。すべてのストリームがそれらをサポートしているわけではないというだけです。 (個人的には、Position
を呼び出すよりも Seek
プロパティ を使用する方が好きですが、要約すると同じことです。)
データをファイルにダンプするよりもメモリに保存したい場合は、すべてをMemoryStream
に読み込んでみませんか?それはシークをサポートします。例えば:
public static MemoryStream CopyToMemory(Stream input)
{
// It won't matter if we throw an exception during this method;
// we don't *really* need to dispose of the MemoryStream, and the
// caller should dispose of the input stream
MemoryStream ret = new MemoryStream();
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
ret.Write(buffer, 0, bytesRead);
}
// Rewind ready for reading (typical scenario)
ret.Position = 0;
return ret;
}
使用する:
using (Stream input = ...)
{
using (Stream memory = CopyToMemory(input))
{
// Seek around in memory to your heart's content
}
}
これは Stream.CopyTo
.NET4で導入されたメソッド。
実際にファイルシステムに書き込みたい場合は、最初にファイルに書き込み、次にストリームを巻き戻すのと同様のことを行うことができます...しかし、その後、ディスクにファイルが散らからないように、後で削除する必要があります。