807

ストリームで初期化したStreamReaderオブジェクトがあります。次に、このストリームをディスクに保存します(ストリームは.gifまたは.jpgまたはである可能性があります.pdf)。

既存のコード:

StreamReader sr = new StreamReader(myOtherObject.InputStream);
  1. これをディスクに保存する必要があります(ファイル名があります)。
  2. 将来的には、これをSQLServerに保存したいと思うかもしれません。

エンコーディングタイプもありますが、SQL Serverに保存する場合に必要になりますよね?

4

10 に答える 10

1032

Jon Skeet の回答で Tilendor が強調しているように、ストリームにはCopyTo.NET 4 以降のメソッドがあります。

var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();

または、次のusing構文を使用します。

using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
    myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
    myOtherObject.InputStream.CopyTo(fileStream);
}
于 2011-04-01T16:01:34.453 に答える
570

バイナリ ファイル (gif や jpg など) には使用しないでくださいテキストデータ用です。任意のバイナリ データに使用すると、ほぼ確実にデータが失われます。( Encoding.GetEncoding(28591) を使用すればおそらく大丈夫ですが、ポイントは何ですか?)StreamReaderStreamReader

なぜ aStreamReaderをまったく使用する必要があるのですか? バイナリ データをバイナリ データとして保持し、バイナリ データとしてディスク (または SQL) に書き戻さないのはなぜですか?

編集:これは人々が見たいと思うものであるように思われるので...あるストリームを別のストリームに(たとえばファイルに)コピーしたいだけなら、次のようなものを使用してください

/// <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);
    }    
}

これを使用してストリームをファイルにダンプするには、たとえば次のようにします。

using (Stream file = File.Create(filename))
{
    CopyStream(input, file);
}

Stream.CopyTo基本的に同じ目的を果たす.NET 4で導入されたことに注意してください。

于 2009-01-04T20:08:51.513 に答える
30
private void SaveFileStream(String path, Stream stream)
{
    var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
    stream.CopyTo(fileStream);
    fileStream.Dispose();
}
于 2013-12-11T14:38:26.200 に答える
7
//If you don't have .Net 4.0  :)

public void SaveStreamToFile(Stream stream, string filename)
{  
   using(Stream destination = File.Create(filename))
      Write(stream, destination);
}

//Typically I implement this Write method as a Stream extension method. 
//The framework handles buffering.

public void Write(Stream from, Stream to)
{
   for(int a = from.ReadByte(); a != -1; a = from.ReadByte())
      to.WriteByte( (byte) a );
}

/*
Note, StreamReader is an IEnumerable<Char> while Stream is an IEnumbable<byte>.
The distinction is significant such as in multiple byte character encodings 
like Unicode used in .Net where Char is one or more bytes (byte[n]). Also, the
resulting translation from IEnumerable<byte> to IEnumerable<Char> can loose bytes
or insert them (for example, "\n" vs. "\r\n") depending on the StreamReader instance
CurrentEncoding.
*/
于 2011-07-07T14:30:01.903 に答える
7

FileStream オブジェクトを使用しないのはなぜですか?

public void SaveStreamToFile(string fileFullPath, Stream stream)
{
    if (stream.Length == 0) return;

    // Create a FileStream object to write a stream to a file
    using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length))
    {
        // Fill the bytes[] array with the stream data
        byte[] bytesInStream = new byte[stream.Length];
        stream.Read(bytesInStream, 0, (int)bytesInStream.Length);

        // Use FileStream object to write to the specified file
        fileStream.Write(bytesInStream, 0, bytesInStream.Length);
     }
}
于 2010-04-23T22:49:05.560 に答える
6

別のオプションは、ストリームを に取得してbyte[]を使用することFile.WriteAllBytesです。これは次のことを行う必要があります。

using (var stream = new MemoryStream())
{
    input.CopyTo(stream);
    File.WriteAllBytes(file, stream.ToArray());
}

拡張メソッドでラップすると、より適切な名前が付けられます。

public void WriteTo(this Stream input, string file)
{
    //your fav write method:

    using (var stream = File.Create(file))
    {
        input.CopyTo(stream);
    }

    //or

    using (var stream = new MemoryStream())
    {
        input.CopyTo(stream);
        File.WriteAllBytes(file, stream.ToArray());
    }

    //whatever that fits.
}
于 2014-02-13T11:04:43.633 に答える
4
public void testdownload(stream input)
{
    byte[] buffer = new byte[16345];
    using (FileStream fs = new FileStream(this.FullLocalFilePath,
                        FileMode.Create, FileAccess.Write, FileShare.None))
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
             fs.Write(buffer, 0, read);
        }
    }
}
于 2013-07-16T06:47:57.673 に答える