【发布时间】:2013-10-28 01:01:03
【问题描述】:
我了解 Indy 开发人员选择在使用 SaveToStream 时去除消息的 BCC 标头,因为流可以是基于套接字的。但是,如果我想将消息实际保存到流中以供进一步处理怎么办?此外,如果我想剥离末尾添加的 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");
当然,这样做的效率极低,完全没有必要。如果可以直接保存到流中,那将是两行代码,而不是上面的混乱。
有没有更好的方法?添加一个重载的SaveToStream 以允许删除 CRLF.CRLF 并在 Indy 中保存 BCC 标头如何?从 MBOX 加载消息时,LoadFromStream 也类似,因此可以直接从流中加载,无需添加尾随 CRLF.CRLF。
【问题讨论】:
标签: delphi stream c++builder indy