2016-02-04 43 views
-1

任務是將多個項目從一個文件夾移動到另一個而不使用任何循環(基本上一次移動1個項目,然後重複該過程一次又一次)。事實上,我在談論C#等同於在Outlook中選擇文件夾中的多個項目並將它們移動到別處。有沒有辦法做到這一點,或者我堅持循環嗎?提前致謝。移動Outlook文件夾之間的多個項目 - C#

+1

這是源於某種測試嗎? – kayess

回答

0

雖然偶爾會很高興能夠一次移動一堆消息,但簡單的答案是你不能。

EWS API不提供一次性移動消息列表的方法,只提供將單個消息移動到不同文件夾的方法。因此,您一直在循​​環瀏覽消息並逐個移動它們。

,順便說一下,是Outlook如何,似乎做...所以在這方面你至少滿足這一要求:)

+0

顯然,Outlook使用一些其他算法而不是簡單的循環。如果你通過100個消息循環來刪除它們,通過item.Delete(),它需要大約10到15秒來遍歷所有的消息。如果您在收件箱中選擇100封郵件並按下「刪除」 - 他們幾乎立即轉到「已刪除郵件」。這是使命 - 實現類似的表現。 – Onewinged

+0

@Onewinged如果您一次刪除幾千條條目,則需要花時間遍歷它們。它做得相當快,但並非瞬間。如果運行速度更快,那可能是因爲微軟擁有Outlook使用的封閉API。這些年來,他們已經將各種類似的東西加入到他們的系統中,所以我發現Outlook有與Exchange交流的方式,沒有其他人可以使用。 – Corey

0

我認爲你需要一個循環像的foreach遍歷所選郵件項目的集合。

0

Outlook對象模型不提供任何方法一次移動多個項目。使用MailItem類的Move方法移動循環中的項目。

0

在擴展MAPI級別(僅限C++或Delphi)上,IMAPIFolder::CopyMessages(MESSAGE_MOVE)獲取條目標識列表,因此允許在單個調用中移動或複製多個消息。

但是,Outlook對象模型只允許一次複製或移動一條消息。如果使用Redemption(任何語言)是一個選項,它會暴露RDOFolder.Items.MoveMultiple/CopyMultiple方法,其中包含「;」或CR/LF分隔的條目ID或條目ID或項目的數組。

2

是的,您可以使用EWS API移動項目而不使用循環。這裏使用的do while循環是循環瀏覽頁面,因爲ItemView的頁面大小爲100.您可以根據需要更改此邏輯。但是我還沒有穿過findResults這是一組電子郵件。

這裏我假設文件夾'Test'位於根文件夾下。如果該文件夾是收件箱下的子文件夾,請將其更改爲WellKnownFolderName.Inbox

List<SearchFilter> searchFilterCollection = new List<SearchFilter>(); 
searchFilterCollection.Add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection); 

ItemView view = new ItemView(100); 
view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject); 
view.Traversal = ItemTraversal.Shallow; 

FindItemsResults<Item> findResults; 
do 
{ 
    findResults = service.FindItems(new FolderId(WellKnownFolderName.Inbox, new Mailbox(user)), searchFilter, view);  

    var itemIds = from item in findResults 
       select item.Id; 

    service.MoveItems(itemIds, 
        (Folder.Bind(service, WellKnownFolderName.MsgFolderRoot) 
        .FindFolders(new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "Test"), new FolderView(1)) 
        .FirstOrDefault(x => x.DisplayName == "Test")).Id); 

     view.Offset = Convert.ToInt32(findResults.NextPageOffset); 

} while (findResults.MoreAvailable); 
相關問題