[英]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.