发送邮件的bug

来源:互联网 发布:sql优化书籍推荐知乎 编辑:程序博客网 时间:2024/05/21 19:47

 

邮件发送,之前发送的写死路径的文件都正常发送出去了,用

QStringfileName = QFileDialog::getSaveFileName(this,

tr("导出考勤表"),

".",

tr("Files (*.csv)"),

&selectedFilter);

获取的文件名,然后传给发送邮件的函数,然后程序崩溃。跟踪调试到 PartSource* pAttach = new FilePartSource(string(sAttachFile)),是提示Poco::FileNotFoundException。从异常的名字来看,是没有找到文件。但是那个文件是刚生成的,存在的啊,不存在 这个文件不存在这个问题。然后我就想会不会是文件的路径写的有问题,因为Qt的路径是无平台的,即都用“/”表示,poco 的路径就不一定支持的说。然后用Qt 的表示方法试验之后,发送邮件成功。所以不是路径的问题。然后我就查看这个FilePartSource函数,希望看到源代码,没有,直接进入汇编语言中了。然后我想着应该有注释吧。转到定义之后发现如下注释:

/// Creates theFilePartSource for the given path.

///

///The MIME type is set to application/octet-stream.

///

/// Throws an OpenFileExceptionif the file cannot be opened.

黄色的说明这个函数抛出的异常类型,以及异常原因。所以这是因为文件不能被打开。

于是上网搜索都有什么原因不能打开文件?

总结大概有3种原因:

1.个是文件不存在, 你以读写的方式打开, 就会失败.

2.另一个是文件正在被别的程序使用, 这个时候你也无法打开.

3.就是你没有操作该文件的权限.

 

然后想起来,我是用getSaveFileName保存文件的形式打开文件的,猜测这个文件用这种方式获得的文件路径,文件已经被程序使用了。并且没有明确的说明这个文件是否被使用,是否被释放了。

或者说

 今天写一个文件分割与合并的程序,开始使用C语言的file操作fopen等函数写的,后来又用C++文件流写了一遍,发现了一些问题。

    在读子文件的时候,只能成功的打开第一个子文件进行读操作,第二个文件就打不开了,我找了半天,最终发现原因是因为我没有调用clear函数。因为我为读文件只申请了一个对象ifstream fRead,然后读完每一个子文件,就进行fRead.close(),之后再用fRead.open打开下一个文件进行读,事实上这样会失败,尽管close之后fRead的值已经变为0,而且用GetLastError得到错误代码是0。正确的做法是在fRead.close之后或之前调用fRead.clear。

    找出这个错误之后,我又重新用fopen等函数做了实验,即用同一个文件句柄进行读不同文件的操作,这样没有任何问题,调用close函数可以正常打开下个文件。

    总结一下,就是用同一个文件流对象对不同文件进行读操作时,读完毕之后不能只调用close,还要调用clear,文件流的close函数和C语言的close还是有区别的。

 

源文档 <http://blog.csdn.net/zero_226/article/details/5740727>

 

 

于是用getOpenFileName打开这个文件之后,就发送成功。 原因应该是getOpenFIleName这个函数会在打开文件之前检测文件流标识位的归位问题吧。

0 0
原创粉丝点击