Attachment.SaveAsFile方法(Outlook) - 错误:无法保存附件。找不到此文件。验证路径和文件名是否正确

时间:2014-04-29 23:35:20

标签: outlook save add-in attachment

我正在使用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方法进程相关。

三位用户测试了这个问题。两个在加利福尼亚州圣地亚哥,一个在纽约,纽约。纽约的人失败了,圣地亚哥的两个人没有遇到这个问题。

有人会知道这个问题可能是什么原因吗?

1 个答案:

答案 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);