2016-08-04 7 views
0

Я знаю, как добавлять файлы в MailItem.Attachments, но как проверить, добавлен ли файл в приложения?Вложения MailItem - проверьте, прикреплен ли файл уже

Например, у меня есть имя файла "C:\\myFolder\\myFile.txt". Как проверить, прикреплен ли этот файл или нет? Мне нужно это, чтобы предотвратить двойное прикрепление файла к новому письму.

Вот то, что я до сих пор:

var mItem = Outlook.Interfaces.HostAddIn.Application.ActiveInspector().CurrentItem as MailItem; 

if (mItem != null) 
{ 
    //this works fine but I need to check if already attached first like below 
    //mItem.Attachments.Add(localFilePath); 

    bool found = false; 
    string attachments = ""; 
    for (int i = 1; i <= mItem.Attachments.Count; i++) 
    { 
     attachments += 
      "DisplayName: " + mItem.Attachments[i].DisplayName //shows just myFile.txt, no path 
      + "/FileName: " + mItem.Attachments[i].FileName //shows just myFile.txt, no path 
      + "/PathName: " + mItem.Attachments[i].PathName; //shows "" 

     //I tried here PathName, FileName, DisplayName but all return just name, without the path 
     if (mItem.Attachments[i].PathName == localFilePath) 
     { 
      found = true; 
     } 
    } 
    if (!found) 
    { 
     mItem.Attachments.Add(localFilePath); //attach only if not already attached 
    } 
} 

ответ

1

Что у вас есть довольно много, что вы можете сделать - FileName будет соответствовать, PathName всегда будет пустым, и DisplayName будет такой же, как FileName.

Вы также можете сравнить старые и существующие размеры файлов, но не использовать Attachment.Size, так как он включает в себя размер указанных свойств MAPI и фактические данные файла.

Также не забудьте проверить, что Attachmeent.Type == olByValue: вам нужны только обычные вложения.

Вы также можете (если имя файла совпадает) сохранить существующее вложение в временную папку (Attachment.SaveAsFile) и сравнить размеры файлов. Если они совпадают, вы также можете сравнить контекст (например, вычислить CRC).

Обратите внимание, что вы не можете получить доступ к данным вложения напрямую, используя только OOM, вам потребуется Extended MAPI (IAttach::OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...)) или Redemption (Attachment.AsText/AsArray/etc.). В противном случае вам нужно будет использовать Attachment.SaveAsFile, а затем удалить временный файл.

+0

Спасибо, Дмитрий. Не существует способа проверить только путь + имя файла на путь + имя файла файла, который я прикрепляю? Я добавляю файл в Вложения, в котором указывается путь файла + имя_файла. Я удивлен, что не могу получить то же самое от уже прикрепленных файлов. – pixel

+1

Нет, информация о пути никогда не сохраняется даже в том случае, если она не является привязкой к ссылке. На уровне MAPI файлы даже не вступают в игру - данные поступают как IStream в свойство PR_ATTACH_DATA_BIN. –

+0

Спасибо миллиону Дмитрию – pixel