CopyTo
アプリを使用するシステムが.NET 4.0以降にアップグレードされていない可能性があるため、を使用してすべての回答を得ることができません。人々に強制的にアップグレードさせたいと思う人もいますが、互換性も素晴らしいです。
もう1つ、ストリームを使用して最初から別のストリームからコピーすることはありません。なぜそうしないのですか?
byte[] bytes = myOtherObject.InputStream.ToArray();
バイトを取得したら、簡単にファイルに書き込むことができます。
public static void WriteFile(string fileName, byte[] bytes)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!path.EndsWith(@"\")) path += @"\";
if (File.Exists(Path.Combine(path, fileName)))
File.Delete(Path.Combine(path, fileName));
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write))
{
fs.Write(bytes, 0, (int)bytes.Length);
//fs.Close();
}
}
このコードは、.jpg
ファイルでテストしたとおりに機能しますが、小さいファイル(1 MB未満)でのみ使用したことは認めています。1つのストリーム、ストリーム間でのコピー、エンコーディングの必要なし、バイトの書き込みのみ!StreamReader
既にbytes
直接ストリームに変換できるストリームがある場合、で複雑化する必要はありません.ToArray()
。
この方法で私が見ることができる潜在的な欠点は、大きなファイルがあり、それをストリームとして持ち、バイト配列を使用して1つずつバイトを読み取る代わりに、.CopyTo()
それと同等またはFileStream
それを使用してストリーミングできることです。結果として、この方法で実行するのが遅くなる可能性があります。しかし.Write()
、FileStream
ハンドルのメソッドがバイトを書き込むので、チョークするべきではなく、一度に1バイトしか実行しないため、ストリームをaとして保持するのに十分なメモリが必要でbyte[]
あることを除いて、メモリを詰まらせませんオブジェクト。これを使用した私の状況では、を取得しOracleBlob
、に移動する必要がありましたbyte[]
。それは十分に小さかっただけでなく、いずれにせよ、ストリーミングを利用できなかったため、上記の関数にバイトを送信しました。
ストリームを使用する別のオプションCopyStream
は、別の投稿にあるJon Skeetの関数と一緒に使用することです。これはFileStream
、入力ストリームを受け取り、そこから直接ファイルを作成するために使用します。File.Create
彼のようには使用しません(最初は問題があるように見えましたが、後でVSのバグである可能性が高いことがわかりました...)。
/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
public static void WriteFile(string fileName, Stream inputStream)
{
string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (!path.EndsWith(@"\")) path += @"\";
if (File.Exists(Path.Combine(path, fileName)))
File.Delete(Path.Combine(path, fileName));
using (FileStream fs = new FileStream(Path.Combine(path, fileName), FileMode.CreateNew, FileAccess.Write)
{
CopyStream(inputStream, fs);
}
inputStream.Close();
inputStream.Flush();
}