我正在编写一个程序,使用libcurl获取大量电子邮件文件,然后将文件写入磁盘,然后生成收据。
我的问题是,虽然大多数收据似乎都是写的,但大部分电子邮件都没有写入磁盘。更糟糕的是,即使文件没有写入,ofstream也会返回成功 - 因此即使文件写入未成功完成,收据也会被写入。
我的猜测是,因为ofstream是异步的,如果写入没有及时完成,那么它将被丢弃在地板上 - 只有一定数量的写入可能同时发生。我只想猜到这里。 也许我需要重构我的代码来同步编写 - 但我不相信这是必要的。有谁知道如何才能使这项工作?
电子邮件大小从几KB到几MB不等。
$
这是另一个功能的一部分,并且已被删除,因此只显示此问题的显着代码。
int write_file(string filename, string mail_item) {
ofstream out(filename.c_str());
out << mail_item;
out.close();
out.flush();
if (!out) {
return FUNCTION_FAILED;
}
return FUNCTION_SUCCESS;
}
感谢所有建议!谢谢!
答案 0 :(得分:0)
好。我找到了答案 - 可能有更好的答案 - 但这个对我有用。问题似乎出现在OS(Linux,在这种情况下) - ofstream完成,已经将文件写入操作系统的责任,但文件还没有实际写入(所以虽然ofstream可能是同步的文件的端到端写入,从数据到文件安全地写入磁盘,是不是。鉴于我已经快速连续地(可能有数千个)大量写入,这不一定有效。操作系统可能会抛弃它并将大量文件写入地板(因此我原始请求以同步方式编写文件 - 端到端)。
我的解决方案是在每次写入后暂停,以便让操作系统有时间赶上。虽然它不优雅,但并不像它应该的那样高效 - 它不需要半秒钟来写一个空文件。此外,在缓慢存储时,半秒可能没有足够的时间。我欢迎任何关于如何改进我的代码的聪明建议。
int write_file(string filename, string mail_item) {
ofstream out(filename.c_str());
if (!out) {
return FUNCTION_FAILED;
}
out << mail_item << endl;
out.flush();
usleep(500000); //wait for half a second to give the OS time to output the file
if (!out) {
return FUNCTION_FAILED;
}
out.close();
if (!out) {
return FUNCTION_FAILED;
}
return FUNCTION_SUCCESS;
}