C# Outlook VSTO 联系人在删除时复制
本文关键字:删除 复制 联系人 Outlook VSTO | 更新日期: 2023-09-27 18:34:47
更新联系人时,我只是删除旧联系人并将其替换为新联系人,因为我懒得检查所有联系人的所有字段。
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 提取到临时文件夹。
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
应用程序类的 Session
属性返回应在之后释放的命名空间类的实例。命名空间类的 GetDefaultFolder
方法返回 MAPIFolder 类的实例,该实例也应释放。
System.Runtime.InteropServices.Marshal.ReleaseComObject 在完成使用 Outlook 对象后释放该对象。如果您的外接程序尝试枚举存储在 Exchange 服务器上的集合中的 256 个以上的 Outlook 项目,这一点尤其重要Microsoft。如果不及时释放这些对象,则可能会达到 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();
}
}
}