簡體   English   中英

C#Outlook VSTO聯系人在刪除時重復

[英]C# Outlook VSTO contacts duplicating while deleting

更新聯系人時,我只是刪除舊聯系人並用新聯系人替換,因為我不必費心檢查所有聯系人的所有字段。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        string sTempPath = GetTemporaryDirectory();

        //RequestContacts();
        ExtractContacts(sTempPath);
        ImportContacts(sTempPath);
    }

“ RequestContacts()”將服務器中的聯系人以zip格式下載到apps目錄。

public string GetTemporaryDirectory()
    {
        string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
        Directory.CreateDirectory(tempDirectory);
        return tempDirectory;
    }

這只是找到一個臨時文件夾以將聯系人提取到Outlook中,然后從中導入。

private void ExtractContacts(string sExtractPath)
    {
        string sImportPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
        string sZipPath = sImportPath.Substring(6, sImportPath.Length - 6) + "/contacts.zip";
        ZipFile.ExtractToDirectory(sZipPath, sExtractPath);
    }

這會將下載的聯系人從zip提取到temp文件夾。

private void ImportContacts(string sImportPath)
    {
        var oldContacts = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items.Cast<Outlook.ContactItem>()
            .Where(c => c.ManagerName.Equals("QERP"));
        foreach (var oldContact in oldContacts)
        {
            oldContact.Delete();
        }

        var newContacts = Directory.GetFiles(sImportPath, "*.vcf").Select(Application.Session.OpenSharedItem).Cast<Outlook.ContactItem>();
        foreach (var newContact in newContacts)
        {
            newContact.ManagerName = "QERP";
            newContact.Save();
        }
    }

這會刪除我們下載的舊聯系人,而不是此應用未下載的聯系人。

問題在於它不會刪除所有聯系人。 由於某種原因,它總是刪除half + 1。

我建議從釋放底層COM對象開始,並避免在一行代碼中出現多個點。 例如:

 Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items

Application類的Session屬性返回Namespace類的實例,該實例應在之后釋放。 Namespace類的GetDefaultFolder方法返回MAPIFolder類的實例,該實例也應釋放。

使用完后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject釋放Outlook對象。 如果您的加載項嘗試枚舉Microsoft Exchange Server上存儲的集合中的256個以上Outlook項目,則這尤其重要。 如果不及時釋放這些對象,則可以達到Exchange對任何一次打開的最大項目數施加的限制。 然后在Visual Basic中將變量設置為Nothing(在C#中為null)以釋放對該對象的引用。 在“ 系統發布對象”文章中了解有關此內容的更多信息。

    foreach (var oldContact in oldContacts)
    {
        oldContact.Delete();
    }

請使用for循環。 它將允許立即釋放代碼中的基礎COM對象。 對於刪除Outlook項目,我建議使用while循環,您可以在其中檢查可用項目的數量或for循環來減少計數器。

刪除項目時請勿使用“ foreach”循環-您正在修改集合,從而跳過了一半項目。 使用向下的“ for”循環

Outlook.Items items = oldContacts.Items;
for (int i = items.Count; i >= 1; i--)
{
   Outlook.ContactItem contact = items[i] as Outlook.ContactItem; 
   if (contact != null)  //could be a distribution list
   {
      contact.Delete();
   } 
}

它正在工作並刪除所有聯系人。 我知道了。 幫助我進行干凈的編碼。

    private void Contact_Sil()
    {
        var Eski_Contacts = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items.Cast<Outlook.ContactItem>();
        while ( Eski_Contacts.Count()>0)
        {
            Eski_Contacts = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items.Cast<Outlook.ContactItem>();
            foreach (var oldContact in Eski_Contacts)
            {
                oldContact.Delete();
            }                
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM