我正在使用Outlook AddIn,它具有将电子邮件及其附件保存到网络驱动器的功能。
对于该应用程序的其中一个用户,当连续保存10个大约1MB的pdf时,应用程序崩溃并显示以下错误消息:
Cannot Save the Attachment. Cannot Find This File. Verify the Path and File Name are Correct.
用户进行了三次测试,问题在同一个pdf上发生了两次,另一次发生在另一次上。
以下是相关代码片段:
For myCount As Integer = 1 To inMailItem.Attachments.Count
If inMailItem.Attachments(myCount).Type <> Outlook.OlAttachmentType.olOLE Then
Dim thisFileName = IO.Path.GetFileName(inMailItem.Attachments(myCount).FileName)
Dim thisExt = IO.Path.GetExtension(thisFileName)
Dim charsAvailable = 46 - thisExt.Length ' [filename][random].ext <= 50 chars
Dim tmpFileName = IO.Path.GetFileNameWithoutExtension(thisFileName.Substring(0, Math.Min(thisFileName.Length, charsAvailable))) + GetRandomChars(4) + thisExt
fileName = EscapeSqlInput(tmpFileName)
attachmentFilePath = myDirectoryName & "\" & fileName
fileInfo = New IO.FileInfo(attachmentFilePath)
isValidFileType = "1"
isEmailBody = "0"
sortOrder += 1
inMailItem.Attachments(myCount).SaveAsFile(attachmentFilePath)
attachmentFileSize = fileInfo.Length
sb = New StringBuilder()
sb.Append("INSERT INTO EmailDocuments (EmailFileID, DirectoryPath, FileName, IsValidFileType, AttachmentFileSize, IsEmailBody, SortOrder) ")
sb.AppendFormat("VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}')",
emailFileId,
directoryPath,
fileName,
isValidFileType,
attachmentFileSize,
isEmailBody,
sortOrder)
SqlHelper.SqlExecuteNonQuery(sb.ToString())
End If
Next
在网络驱动器上,我可以看到一个.tmp文件,其中包含与原始文件完全相同的字节数。如果我将.tmp扩展名切换为.pdf,我可以使用adobe reader打开文件。我在同一个驱动器上看到另一个.pdf文件,这个文件包含0个字节。
我假设空pdf文件,tmp文件与SaveAsFile方法进程相关。
三位用户测试了这个问题。两个在加利福尼亚州圣地亚哥,一个在纽约,纽约。纽约的人失败了,圣地亚哥的两个人没有遇到这个问题。
有人会知道这个问题可能是什么原因吗?
答案 0 :(得分:1)
听起来好像你的RPC通道已经用完了。避免使用多点符号(特别是在循环中)并在完成后立即释放所有对象
Attachments attachments = inMailItem.Attachments;
for (int myCount = 1; myCount <= attachments.Count; myCount++)
{
Attachment attach = attachments.Item(myCount);
attach.SaveAsFile(attachmentFilePath);
Marshal.ReleaseComObject(attach);
}
Marshal.ReleaseComObject(attachments);