SaveToStream
ストリームはソケットベースである可能性があるため、使用時にメッセージの BCC ヘッダーを削除することを Indy 開発者が選択したことを理解しています。しかし、さらに処理するために実際にメッセージをストリームに保存したい場合はどうすればよいでしょうか? さらに、末尾に追加された CRLF.CRLF を削除したい場合はどうすればよいでしょうか? この例は、メッセージを MBOX タイプのファイルに保存することです。もちろん、これは直接行うことはできません。
したがって、現在の私のアプローチは本当に混乱しています。
// Writing to MBOX
// Save to temp file
IdMsg->SaveToFile("filenamewrite.tmp",false);
// Make file shorter by 5 trailing bytes
boost::scoped_ptr<TFileStream> fs(new TFileStream("filenamewrite.tmp", fmOpenWrite | fmShareDenyWrite));
fs->Size = fs->Size-5;
FlushFileBuffers(reinterpret_cast<void *>(fs->Handle));
// Now this file can be copied to another stream with "mbox"-like file.
そして読み込みのために:
// Reading from MBOX
boost::scoped_ptr<TFileStream> fs(new TFileStream("mboxfile", fmOpenRead | fmShareDenyWrite));
AnsiString Data;
Data.SetLength(12345);
fs->Read(const_cast<void *>(Data.data()), Data.Length());
boost::scoped_ptr<TStringList> sl(new TStringList);
sl->Text = Data;
sl->SaveToFile("filenameread.tmp");
IdMsg->LoadFromFile("filenameread.tmp");
もちろん、これは非常に非効率的な方法であり、まったく不要です。ストリームに直接保存できる場合は、上記の混乱ではなく 2 行のコードになります。
より良い方法はありますか?SaveToStream
CRLF.CRLF を削除して BCC ヘッダーを Indy に保存できるようにオーバーロードを追加するのはどうですか? また、メッセージが MBOX からロードされる場合も同様であるためLoadFromStream
、末尾に CRLF.CRLF を追加する必要なく、ストリームから直接ロードできます。