web-dev-qa-db-ja.com

メモリストリームをファイルに書き込む

私はjson形式のデータを文字列として取得してファイルに書き込んでみましたが、うまくいきました。今、私は同じことをするためにMemoryStreamを使おうとしていますが、ファイルに何も書き込まれません-実際のデータがない[{}、{}、{}、{}、{}]だけです。

私の質問は-データが実際にメモリストリームに正しく送信されるかどうか、または問題が別の場所で発生するかどうかを確認するにはどうすればよいですか。 myListにデータが含まれていることは知っています。

これが私のコードです:

MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(List<myClass>));
dcjs.WriteObject(ms, myList);

using (FileStream fs = new FileStream(Path.Combine(Application.StartupPath,"MyFile.json"), FileMode.OpenOrCreate))
{
                ms.Position = 0;
                ms.Read(ms.ToArray(), 0, (int)ms.Length);
                fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
                ms.Close();
                fs.Flush();
                fs.Close();
 }
7
Coding Duchess

非常に便利なメソッドStream.CopyTo(Stream)があります。

using (MemoryStream ms = new MemoryStream())
{
    StreamWriter writer = new StreamWriter(ms);

    writer.WriteLine("asdasdasasdfasdasd");
    writer.Flush();

    //You have to rewind the MemoryStream before copying
    ms.Seek(0, SeekOrigin.Begin);

    using (FileStream fs = new FileStream("output.txt", FileMode.OpenOrCreate))
    {
        ms.CopyTo(fs);
        fs.Flush();
    }
}

また、fsはusingステートメント内にあり、最後に破棄されるため、閉じる必要はありません。

31
Philippe Paré

問題は、ファイルストリーム/メモリストリームとは関係ありません。問題は、DataContractJsonSerializerがOPT INシリアライザーであることです。追加する必要があります[DataMemberAttribute]myClassでシリアル化する必要があるすべてのプロパティに。

[DataContract]
public class myClass
{
     [DataMember]
     public string Foo { get; set; }
}
1
Aron
 using (var memoryStream = new MemoryStream())
 {
    ...

     var fileName = $"FileName.xlsx";
     string tempFilePath = Path.Combine(Path.GetTempPath() + fileName );
     using (var fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
     {
        memoryStream.WriteTo(fs);
     }

 }
0
Amir

この行には問題があります:

ms.Read(ms.ToArray(), 0, (int)ms.Length);

この時点で、特にmsをmsに読み込むようにコードが記述されている場合は、メモリストリームに何も読み込む必要はありません。

この行を削除するだけで問題が解決すると確信しています。

0
Russ

//ストリームの位置をリセットします

ms.Position = 0;

//次にfilestreamにコピーします

ms.CopyTo(fileStream);
0
santosh singh