2015-05-08 98 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

相關問題