web-dev-qa-db-ja.com

C#でストリームをFileStreamに変換する

C#を使用してストリームをFileStreamに変換するための最良の方法は何ですか。

私が取り組んでいる関数には、アップロードされたデータを含むStreamが渡されており、FileStreamタイプのメソッドであるstream.Read()、stream.Seek()メソッドを実行できる必要があります。

単純なキャストは機能しないので、ここで助けを求めています。

13
Greg

ReadSeekは、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で導入されたメソッド。

実際にファイルシステムに書き込みたい場合は、最初にファイルに書き込み、次にストリームを巻き戻すのと同様のことを行うことができます...しかし、その後、ディスクにファイルが散らからないように、後で削除する必要があります。

21
Jon Skeet