2015-05-08 101 views
0

通过在Outlook消息存储消息(的getItem对象)循环,并使用下面的代码保存附件作为文件:PDF Outlook电子邮件附件有时保存没有权限

try 
{ 
     foreach (Outlook.Attachment attach in getItem.Attachments) 
     { 
      if (attach.FileName == sItemName) 
      { 
       string sSaveFile = Path.GetTempPath() + "Attachment" + sItemType; 
       if (System.IO.File.Exists(sSaveFile)) System.IO.File.Delete(sSaveFile); 
       attach.SaveAsFile(sSaveFile); 
       sContent = Common.GetFileContent2(sSaveFile); 
      } 
     } 
} 
catch (Exception Ex) 
{ 
     Common.LogError("GetUpdated", Ex, "Get text from Email attachment", "Error", false); 
} 
System.Runtime.InteropServices.Marshal.ReleaseComObject(getItem.Attachments); 

我发现,所提取的PDF文件有时当另一个PDF文件出现时无法进行删除。提取的PDF文件的文件权限无法在资源管理器中查看 - 属性的“安全性”选项卡显示“您必须具有读取权限才能查看此对象的属性”。常规属性选项卡可以读取OK。

我使用Outlook 2007在Windows 8.1

+0

代码中使用了什么文件路径?你是否以管理员权限运行Outlook? –

+0

保存文件夹的路径是用户Temp目录,它是C:\ User \ AppData \ Local \ Temp。我曾尝试重新安装Office,但没有成功,正如其他人遇到类似问题所建议的那样。 Outlook不具有任何特权。它被调用 'Outlook.Application myApp = new Outlook.Application(); Outlook.NameSpace mapiNameSpace = myApp.GetNamespace(“MAPI”);'。删除文件失败的情况下没有可识别的模式,只发生在PDF上。大约90秒后,无许可证的PDFS消失 – SimonKravis

+0

我在代码中看不到什么奇怪的东西。尝试在另一台PC上运行它。你有相同的结果吗?你有问题的电脑上有任何防病毒软件? –

回答

0

我建议你从检查代码,并立即释放所有潜在的COM对象开始。完成使用后,请使用System.Runtime.InteropServices.Marshal.ReleaseComObject释放Outlook对象。如果您的加载项尝试枚举存储在Microsoft Exchange Server上的集合中的超过256个Outlook项目,这一点尤其重要。如果您没有及时释放这些物品,您可以达到Exchange对任何时候打开的物品的最大数量施加的限制。然后在Visual Basic中将变量设置为Nothing(C#中的空值)以释放对该对象的引用。您可以在MSDN的Systematically Releasing Objects文章中阅读更多。

例如:

foreach (Outlook.Attachment attach in getItem.Attachments) 

的附件属性返回附件类应后释放的一个实例。此外,Attachment类的每个实例都会保持活动状态,直到方法结束并且GC运行。

最后,我建议使用循环代替。因此,您将能够立即释放每个对象。

+0

任何想法为什么错误只发生在pdf附件?正在处理的电子邮件存档具有.doc,.docx的消息。 .txt和其他附件文件类型,但是可以从所有这些文件中提取文本 – SimonKravis

相关问题